cod*_*gal 2 ruby arrays sorting
我需要检查数组的任何2个元素的总和是否等于给定的数字.这就是我提出的,但它似乎没有进行比较
def sum_comparison(int_array, x)
n = int_array.length
(0..n).each do |i|
(1..n).each do |j|
if ((int_array[i].to_i + int_array[j].to_i) == x)
return true
else
return false
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
你的解决方案似乎过于复杂,并且受到像C这样的低级过程语言的编程风格的强烈影响.一个明显的问题是你写的
n = int_array.length
(0..n).each do |i|
# use int_array[i].to_i inside the loop
end
Run Code Online (Sandbox Code Playgroud)
现在在each循环中,你将得到数字i = 0, 1, 2, ..., n,例如int_array = [3,4,5]你得到的i = 0, 1, 2, 3.请注意,有四个元素,因为您从零开始计数(这被称为关闭一个错误).这最终会导致数组访问n,这是一个超出数组末尾的访问.这将再次导致nil返回,这可能是您使用to_i将其转换回整数的原因,因为否则您会得到一个TypeError: nil can't be coerced into Fixnum添加的东西.您可能想要的只是:
int_array.each do |i|
# use i inside the loop
end
Run Code Online (Sandbox Code Playgroud)
对于示例数组,[3,4,5]这实际上会导致i = 3, 4, 5.要以更Ruby方式获取数组的组合,您可以使用Array#combination.同样,您可以使用Array#any?检测任何组合是否满足指定条件:
def sum_comparison(array, x)
array.combination(2).any? do |a, b|
a + b == x
end
end
Run Code Online (Sandbox Code Playgroud)
当你的函数比较第一个元素时,它会立即返回false.您需要在迭代时返回true,如果没有找到,则返回false,以避免此问题:
def sum_comparison(int_array, x)
n = int_array.size
(0...n).each do |i|
(1...n).each do |j|
if (int_array[i].to_i + int_array[j].to_i) == x
return true
end
end
end
false
end
Run Code Online (Sandbox Code Playgroud)
为了简化这个,你可以使用permutation或combination与any?方法,如@ p11y建议.要获得您可以使用find或detect创建的元素.
def sum_comparison(a, x)
a.combination(2).any? { |i, j| i + j == x }
end
a.combination(2).detect { |i, j| i + j == x }
# sum_comparison([1,2,3, 4], 6) => [2, 4]
Run Code Online (Sandbox Code Playgroud)