Для L oop в R найти дубликаты в одном векторе БЕЗ встроенных функций - PullRequest
0 голосов
/ 06 апреля 2020

Я нашел это как вопрос для интервью и, похоже, не могу решить проблему. Вы не можете использовать любые встроенные функции R.

x <- c(77, 12, 4, 8, 77, 2, 4, 12)
answer <- FALSE #int the answer to FALSE

То, как я смотрю на это, l oop берет 77 и сравнивает его справа. Как только он видит следующие 77 в точке x [5], он должен вернуть ответ <- TRUE, и код должен полностью остановиться. Но притворимся, что первое число не является дубликатом, тогда в следующий раз ему не нужно снова смотреть на x [1], так как его уже сделали x [1] против x [2] при первом проходе. </p>

Это то, над чем я работал, но, похоже, не понимаю. У меня есть n <- длина (х). Я добавил переменную count <- 0, но в течение первого l oop он увеличивается на 1. Затем в следующем l oop я говорю «смотреть из счета в конец», но не уверен, что это исправить тоже. Кажется, что происходит то, что он не разрывается при первом дубликате, затем достигает последнего индекса в x и сравнивает его с собой, возвращая, таким образом, TRUE, что неверно. </p>

for (i in 1:n){  #wasn't sure if this should be 2:n?
count <- count +1
  for (stuff in (count:n)){ 
    if (stuff){
      answer <- TRUE
      break #I thought this would break the entire code when it see's x[1] vs x[5] which is 77 duplicate
    }
  }
}
answer

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Это будет работать:

x <- c(77, 12, 4, 8, 77, 2, 4, 12)
answer <- FALSE
n <- length(x)
for(count in 1:n){
  for(compare in x[-count]){
    if(x[count] == compare){
      answer <- TRUE
      break()
    }
  }
  if(answer){break()}
}
0 голосов
/ 06 апреля 2020

Следующее:

!all(duplicated(x))

Кажется, работает и не использует функции any(), is.element или %in%. Если вы хотите, чтобы ваш учитель стал умнее и выучил определение «встроенных» функций, вы можете ответить на это:)

Редактировать: В противном случае хороший алгоритм можно найти там в O ( n) время и O (1) дополнительное пространство.

0 голосов
/ 06 апреля 2020

Это должно работать:

for (i in x) {
  repeats <- length(x[x == i])
  if (repeats < 2) {

  } else {
    print(paste(i, "has duplicates"))
    break
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...