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

时间:2016-08-30 05:11:58

标签: arrays ruby addition

这是来自CoderByte的Array Addition I问题: 让函数ArrayAdditionI(arr)获取存储在arr中的数字数组,如果数组中的任何数字组合可以添加到数组中的最大数字,则返回字符串true,否则返回字符串false。

例如:如果arr包含[4, 6, 23, 10, 1, 3],则输出应返回true,因为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

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

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

1 个答案:

答案 0 :(得分:0)

在进行比较之前,有一点是必不可少的,并且要删除阵列中最大的元素。

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

largest = arr.sort!.pop
流行是一种破坏性的方法;它会改变arr的价值。

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

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

总是如此。