学习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
答案 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在原始数组中。