我有两个数组,array1
和array2
。我想检查array1
中是否有任何2个不同的数字,以便它们的总和是array2
中的另一个不同数字。这是我尝试过的,但它似乎并不像我想要的那样完全正常工作。
array1.each do |k|
array1.each do |l|
array2.each do |m|
if k + l == m
# do something with k, l, m
end
end
end
end
答案 0 :(得分:0)
您可以选择两次相同的号码。阿卡与
array1 = [1]
array2 = [2]
您将获得2 == 1 + 1
。为避免这种情况,您可以使用Array#combination
:
array1.combination(2).select { |x, y| array2.include? x + y }.each do |x, y|
# do something with x, y and x + y
end
答案 1 :(得分:0)
我们只是想知道m+n
是否是第二个数组的元素,其中m
和n
是第一个数组的 distinct 元素(我认为这意味着m != n
),我们将要使用Emumerable#any?。
require 'set'
def any_pair?(arr1, arr2)
set = arr2.to_set
arr1.uniq.combination(2).any? { |n,m| set.include?(n+m) }
end
any_pair? [3,1,6,1,4], [1,2,6,7]
#=> true
any_pair? [3,1,6,1,4], [1,2,6]
#=> false
我们需要检查arr1
中两个值的总和是arr2
的成员,最多n*(n-1)
次,其中n
是arr1.size
。我们可以使用Array#include?,但是通过将arr2
转换为集合作为初始步骤,可以提高此操作的效率。设置成员资格查找(实现为哈希查找)非常快。
如果我们希望返回arr1
的所有不同元素对,其总和是arr2
的成员,则该方法将更改为以下内容。
def all_pairs(arr1, arr2)
set = arr2.to_set
arr1.uniq.combination(2).select { |n,m| set.include?(n+m) }
end
all_pairs [3,1,6,1,4], [1,2,6,7]
#=> [[3, 4], [1, 6]]
all_pairs [3,1,6,1,4], [1,2,6]
#=> []