为什么我的数组在每次循环中填充后都是空的?

时间:2015-02-18 23:02:11

标签: ruby

学习Ruby并尝试Coderbyte上的问题。该代码应该可以找到数组中数字之间的数字。所以[4,8,6]应该返回2(它需要5和7才能连续)。 [5,10,15]应返回8,[-2,10,4]应返回10.

我的解决方案是获取数字与下一个最大数字之间的差值,减去1,即它们之间的数字。

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

我无法理解为什么,因为我在new_arr循环之外定义了each。我有什么范围问题吗?

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

2 个答案:

答案 0 :(得分:1)

如果i == arr.length - 1,您不会返回任何内容。

您可能想要返回此值:

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

或使用break代替return,这样您就可以突破最里面的循环。

答案 1 :(得分:1)

您的代码不起作用主要是因为行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])之间的数字之间的数字t在原始数组中。