比较数组中元素的总和:Ruby

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)

Pat*_*ity 7

你的解决方案似乎过于复杂,并且受到像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)

  • 有没有理由使用排列而不是组合?后者是前者的一个子集,足以被考虑. (2认同)

zis*_*she 5

当你的函数比较第一个元素时,它会立即返回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)

为了简化这个,你可以使用permutationcombinationany?方法,如@ p11y建议.要获得您可以使用finddetect创建的元素.

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)