我现在正在做一个练习,我正在寻找数组中的所有零。
输入为:
numbers = [1, 3, 500, 200, 4000, 3000, 10000, 90, 20, 500000]
我想按零数将它们排序到一个哈希中。预期输出为:
expected = {0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000], 1=>[90, 20], 5=>[500000]}
我已经构建了结构,但我不确定如何计算零的数量:
grouped = Hash.new {|hash, key| hash[key] = []}
numbers.each do |num|
grouped[num] << num
end
为清楚起见,已编辑:任何建议将不胜感激。此外,我读到的很多建议都建议将整数数组转换为字符串以解决问题。有没有办法在不将数组转换为字符串的情况下计算位数(不仅仅是零)?在这种情况下,预期输出如下所示:
expected = {1=>[1, 3], 2=>[90, 20], 3=>[500, 200], 4=>[4000, 3000], 5=>[10000], 6=>[500000]
提前谢谢。
像您想要执行的许多转换一样,此转换可在 Enumerable 中找到。
按位数分组:
grouped = numbers.group_by { |n| Math.log10(n).to_i + 1 }
# => {1=>[1, 3], 3=>[500, 200], 4=>[4000, 3000], 5=>[10000], 2=>[90, 20], 6=>[500000]}
按零数分组:
grouped = numbers.group_by { |n| n.to_s.match(/0+$/) ? $&.length : 0 }
# => {0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000], 1=>[90, 20], 5=>[500000]}
group_by
方法是一种将数组转换为哈希的便捷方法,其中的内容被组织成鸽子洞。
我最终使用
grouped = Hash.new {|hash, key| hash[key] = []}
numbers.each do |num|
grouped[num.to_s.count('0')] << num
end
但我真的很喜欢回复的变化。我没有意识到有很多方法可以解决这个问题。谢谢大家。
按非负整数包含的零位数对它们进行分组,您可以这样做:
def nbr_zeroes(n)
return 1 if n == 0
m = n
i = 0
while m > 0
i += 1 if m % 10 == 0
m /= 10
end
i
end
numbers = [1, 3, 500, 200, 4000, 3000, 10000, 90, 20, 500000]
numbers.group_by { |i| nbr_zeroes(i) }
#=> { 0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000] }
numbers = [100000, 100001, 304070, 3500040, 314073, 2000, 314873, 0]
numbers.group_by { |i| nbr_zeroes(i) }
#=> { 5=>[100000], 4=>[100001, 3500040], 3=>[304070, 2000],
# 1=>[314073, 0], 0=>[314873] }
按原木基数 10 的楼层分组?
1.9.3-p484 :014 > numbers.each {|n| grouped[Math.log10(n).floor] << n}
=> [1, 3, 500, 200, 4000, 3000, 10000, 90, 20, 500000]
1.9.3-p484 :016 > grouped
=> {0=>[1, 3], 2=>[500, 200], 3=>[4000, 3000], 4=>[10000], 1=>[90, 20], 5=>[500000]}
或者尝试1 + Math.log10(n).floor
是否需要键为实际位数。