找出列表中的任意两个元素的总和是否为R中的特定值

找出列表中的任意两个元素的总和是否为R中的特定值,r,logic,R,Logic,这是一个典型的面试问题。给定一个列表numbers和一个特定值k,找出当求和时numbers中的任意两个元素是否等于k。在r中,如何用单遍算法而不是穷举搜索来解决这个问题 实际上:在r中编写最佳函数,该函数接收一个列表numbers和一个特定值k,如果numbers中有两个元素的和等于k,则返回TRUE。如果没有,则返回FALSE此问题可能被定义为:数字中是否有a和b,例如: a+b=k?考虑到您已经知道了k,并且假设实际上有两个数字在求和时等于k,可以假设: a=k-b或b=k-a 因此,通过

这是一个典型的面试问题。给定一个列表
numbers
和一个特定值
k
,找出当求和时
numbers
中的任意两个元素是否等于
k
。在
r
中,如何用单遍算法而不是穷举搜索来解决这个问题


实际上:在
r
中编写最佳函数,该函数接收一个列表
numbers
和一个特定值
k
,如果
numbers
中有两个元素的和等于
k
,则返回
TRUE
。如果没有,则返回
FALSE

此问题可能被定义为:
数字中是否有
a
b
,例如:
a+b=k
?考虑到您已经知道了
k
,并且假设实际上有两个数字在求和时等于
k
,可以假设:

a=k-b
b=k-a

因此,通过做
k-numbers
,我们将基本上解决上述两个方程的右边。例如:


numbers我认为您只能在baseR中使用内置函数来实现这一点

让我示范一下-

  • 使用
    outer
    构造一个数向量的和矩阵,比如
    x
    。让我们将中间结果命名为
    y
  • 使用“应用”检查与所需数字相等的
    元素,如
    k
    。我使用了
    arr.ind
    argument=
    T
    ,这样输出又是矩阵格式的索引
  • 在获得所需结果的地方,创建一个包含
    x
    值的最终矩阵

谢谢你的回复。然而,我相信之前发布的解决方案也使用了BaseR,看起来更简单一些?我错过什么了吗?谢谢:)我还要补充一点,如果有任何两个元素满足问题,那么您使用的任何操作都应返回TRUE,如果没有,则返回FALSE。请注册您的第一条评论-这是个人的选择,因为这两种情况下的结果格式不同。注册你的第二条评论——事实上,如果这是唯一的要求,那么它非常简单,不需要编写任何自定义函数就可以完成。我正在编辑答案,以纳入这一要求。我还想补充一点,接受你认为正确的答案是一种良好的做法。但是,每个问题只能接受一个答案。不过,只要你觉得正确,每个问题的答案你都可以投票。当然!我只是好奇你是否认为另一个答案不对。我喜欢你的编辑,没有考虑使用
外部
。建议将
any()
更改为
sum()>0
?哪个更快?
sum_finder <- function(numbers, k) {
    diff_sequence <- k - numbers
    condition <- any(numbers %in% diff_sequence)
    return(condition)
}
sum_finder <- function(numbers, k) {
    return(any(numbers %in% (k - numbers)))
}
# as posted by @eduardokapp
function1 <- function(numbers, k) {
    any(numbers %in% (k - numbers))
}

# as posted by @AnilGoyal
function2 <- function(numbers, k) {
    any(apply(outer(numbers, numbers, `+`), 1, function(x){x == k}))
}

# Performance Comparison
numbers <- sample(500, 500)
k <- sample(500, 1)
microbenchmark::microbenchmark(
   function1(numbers, k),
   function2(numbers, k)
)


x <- 25:40
k <- 61
y <- outer(x, x, `+`)

matrix(x[which(apply(y, 1, function(x){x == k}), arr.ind = T)], ncol = 2)

      [,1] [,2]
 [1,]   36   25
 [2,]   35   26
 [3,]   34   27
 [4,]   33   28
 [5,]   32   29
 [6,]   31   30
 [7,]   30   31
 [8,]   29   32
 [9,]   28   33
[10,]   27   34
[11,]   26   35
[12,]   25   36
x <- 25:40
k <- 61

sum(outer(x, x, `+`) == k) > 0
[1] TRUE

#OR
x <- 1:6
k <- 1

sum(outer(x, x, `+`) == k) > 0
[1] FALSE