Ruby 中的 CoderByte 数组添加 I - 工作代码和非工作代码之间的区别

CoderByte Array Addition I in Ruby - Difference between working code and non-working code

这是我从 CoderByte 提出的数组加法问题: 让函数 ArrayAdditionI(arr) 获取存储在 arr 中的数字数组和 return 字符串,如果数组中的任何数字组合加起来等于数组中的最大数字,则为真,否则 return 字符串错误。

例如:如果 arr 包含 [4, 6, 23, 10, 1, 3],输出应该 return 为真,因为 4 + 6 + 10 + 3 = 23。该数组不会为空,不会包含所有相同的元素,并且可能包含负数。

我想知道为什么会这样:

def ArrayAdditionI(arr)
  sum = []
  largest = arr.sort!.pop
  1.upto(arr.count) do |i|
    arr.combination(i).to_a.each do |subarr|
      sum << subarr.inject(:+)
    end
  end

  sum.include?(largest)
end

但这不会:

def ArrayAdditionI(arr)
  1.upto(arr.count) do |i|
      arr.combination(i).to_a.each do |subarr|
      return true if arr.sort!.last == subarr.inject(:+)
    end
  end

  false
end

或者为什么这不会:

def ArrayAdditionI(arr)
  sorted_arr = arr.sort
  1.upto(arr.count) do |i|
    arr.combination(i).to_a.each do |subarr|
      return true if  sorted_arr.last == subarr.inject(:+)
    end
  end

  false
end

我想强调一下代码之间的一些关键点和区别。在有效的代码中,一个空数组被分配给 "sum." 并且数组中最大的数字被分配给变量 "largest." 要检查最大数是否等于任何总和, .include? 方法被调用。我想尝试通过排序和调用数组上的最后一个整数来访问块内的最大整数,但这似乎不起作用。

我口头尝试过测试用例,但我似乎无法弄清楚代码有什么问题。有什么隐含的东西我只是没有接受吗?

有一点是必不可少的,那就是在进行比较之前删除数组中最大的元素。

请注意,在工作代码中,这发生在迭代之前:

largest = arr.sort!.pop

pop是一种破坏性的方法;它会改变 arr.

的值

在您的尝试中,每次的结果都是 true。我怎么知道?当 i 为 1 时,combination(i) 将是一个长度为 1 的数组。实际上,原始数组中的每个元素都与最大值进行比较。如果最大元素仍然包含在数组中,那么在某个时候你将是 运行:

return true if <maximum> == [<maximum>].inject(:+)

这永远是正确的。