【问题标题】:Why is my array empty after I populated it in this each loop?为什么我的数组在每个循环中填充后是空的?
【发布时间】:2015-02-18 23:02:11
【问题描述】:

学习 Ruby 并尝试在 Coderbyte 上解决问题。此代码应该查找数组中数字之间的数字数量。所以[4,8,6] 应该返回 2(它需要 5 和 7 是连续的)。 [5,10,15] 应该返回 8,[-2,10,4] 应该返回 10。

我的解决方案是获取一个数字与其下一个最大数字之间的差,减一,即它们之间有多少个数字。

当我在每个循环中p new_arr 时,它具有正确的数组:[1,1] 在第一种情况下,[4,4] 在下一种情况下,[5,5] 在最后一种情况下。但是当我退出每个循环时,数组又是空的,new_arr.reduce(:+) 返回 nil。

我不明白为什么,因为我在each 循环之外定义了new_arr。我在这里遗漏了一些范围问题吗?

def Consecutive(arr)

  arr.sort!
  num_of_nums = 0
  new_arr = []
  i = 0
  arr.each do
    return if i == arr.length - 1
    num_of_nums = (arr[i+1] - arr[i]) - 1
    new_arr << num_of_nums
    i+=1
    p new_arr
  end
  new_arr.reduce(:+)
end

【问题讨论】:

    标签: ruby


    【解决方案1】:

    如果i == arr.length - 1,你不会返回任何东西。

    你可能想要返回这个值:

    return new_arr.reduce(:+) if i == arr.length - 1
    

    或者使用break而不是return,这样你就可以跳出最里面的循环。

    【讨论】:

    • 谢谢!这实际上帮助我解决了另一个问题中的一个错误,我没有正确理解 return 和 break 之间的区别。
    【解决方案2】:

    您的代码不起作用主要是因为return if i == arr.length - 1 行。你想跳出循环,但你实际上是在return退出方法,这不是你想要的。

    我认为您对如何使用 each 方法有些困惑,因为您还不必要地使用了迭代器 (i)。使用each_with_index 方法,您的代码会更好。不过,我认为有更好的方法。

    我们真正想做的是找到(arr[0]..arr[-1]).to_a 中所有不在arr 中的数字,对吧?

    arr.sort!
    ((arr[0]..arr[-1]).to_a - arr).count
    

    这将为您提供数组中的最小数字(排序后的arr[0])和数组中的最大数字(排序后的arr[-1])之间不在原始数字中的数字数量数组。

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 2018-11-21
      • 2021-03-03
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2019-02-15
      • 2021-12-10
      • 2022-11-26
      相关资源
      最近更新 更多