【问题标题】:CoderByte Array Addition I in Ruby - Difference between working code and non-working codeRuby 中的 CoderByte 数组加法 I - 工作代码和非工作代码之间的区别
【发布时间】:2016-08-30 05:11:57
【问题描述】:

这是针对我从 CoderByte 提出的数组加法问题: 让函数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

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

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

【问题讨论】:

    标签: arrays ruby addition


    【解决方案1】:

    有一点很重要,那就是在进行比较之前删除数组的最大元素。

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

    largest = arr.sort!.pop
    

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

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

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

    这将永远是正确的。

    【讨论】:

    • 大坝!这有很大帮助!非常感谢@max!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2016-11-29
    • 2019-04-08
    相关资源
    最近更新 更多