我发现这是一个面试问题,似乎无法找到解决方案。您不能使用任何内置的R函数。
x <- c(77, 12, 4, 8, 77, 2, 4, 12)
answer <- FALSE #int the answer to FALSE
我的看法是,循环取77,并将其与右侧进行比较。一旦它看到x[5]处的下一个77,它应该返回答案<-TRUE,则代码应完全停止。但假设第一个数字不是重复的,那么下次通过时就不需要再看x[1]了,因为它在第一次通过时已经完成了x[1]与x[2]的比较。
这是我一直在做的,但似乎无法做到。我有n<-长度(x(。我添加了一个变量计数<-0,但在第一个循环中它递增1。然后在下一个循环中,我说"从计数到结束",但也不确定这是否正确。似乎发生的情况是,它没有在第一个重复处脱离,然后到达x中的最后一个索引,并将其与自身进行比较,从而返回TRUE,这是不正确的。
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
这将起作用:
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()}
}
以下内容:
!all(duplicated(x))
似乎可以工作,并且不使用any()
、is.element
或%in%
函数。如果你想让你的老师变得更聪明,学习"内置"函数的定义,你可以回答:(
编辑:否则,在O(n(时间和O(1(额外空间中可以找到一个好的算法。
这应该有效:
for (i in x) {
repeats <- length(x[x == i])
if (repeats < 2) {
} else {
print(paste(i, "has duplicates"))
break
}
}