我正在练习面试中的问题,遇到了一个“如果”的问题,我不知道如何解决。实践问题如下:
两笔钱。给定一个数组和一个数字N,如果数组中有A,B,使得A+B= N,则返回True,否则,返回False。
示例:
1,2,3,4,5⇒真
3,4,6,6⇒假
我的代码(下面)返回以下错误: if (i + Aj == N) {:TRUE/FALSE需要的缺失值中的错误
fun = function(A,N) {
flag = FALSE
for (i in A) {
for (j in i:length(A)) {
if (i + A[j] == N) {
flag = TRUE
}
}
}
return(flag)
}
fun(as.integer(c(3, 4, 6)),6)发布于 2021-04-13 22:14:38
代码中的问题是第二个for循环应该是1:length(A)而不是i:length(A)。
fun <- function(A, N){
flag = FALSE
for (i in A) {
for (j in 1:length(A)) {
if (i + A[j] == N) {
flag = TRUE
}
}
}
return(flag)
}
fun(as.integer(c(3, 4, 6)), 6)
[1] TRUE当i等于4,而length(A)固定在3时,您发布的代码是排序4:3。j将接受4的值,然后当您尝试索引A[4]时,您将得到NA。
更新
为了避免重复计算代码中的元素,您可以这样做:
fun <- function(A, N){
flag = FALSE
for (i in A) {
for (j in A[A != i]) { # select elements of A that aren't equal to i
if (i + j == N) {
flag = TRUE
}
}
}
return(flag)
}虽然这并不是非常有效,因为它会对一些对进行两次检查。
发布于 2021-04-13 22:13:10
没有循环的矢量化解:
sumN <- function(A,N){
any(colSums(combn(A,2))==N)
}
sumN(c(1,2,3,4),5)
[1] TRUE
sumN(c(3,4,6),6)
[1] FALSEhttps://stackoverflow.com/questions/67083008
复制相似问题