对于R中的循环,在没有内置函数的情况下在单个向量中查找重复项



我发现这是一个面试问题,似乎无法找到解决方案。您不能使用任何内置的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
}
}

最新更新