在Ruby中,有没有一种优雅的方法可以将数字转换为数字数组?

4
对于数字 n,我只能想到
array_of_digits = n.to_s.split('').map(&:to_i)

有没有更优雅的方法?

@itdoesntwork的each_byte方法很有趣,但我认为大多数Ruby程序员会选择你所拥有的,尽管我认为string_of_digits = n.to_s.each_char.map(&:to_i)是一个小改进,因为它不会创建中间数组。 - Cary Swoveland
1个回答

6
不是更优雅,而是更快:
def digits(n)
  (0..Math.log10(n).to_i).map { |dp| n / 10 ** dp % 10 }.reverse
end

我刚刚发现另一个很快的(最快)。

def digits(n)
  n.to_s.each_byte.map { |x| x - 48 }
end

基准测试:

            user     system      total        real
Split map  0.410000   0.000000   0.410000 (  0.412397)
chars      0.100000   0.010000   0.110000 (  0.104450)
each byte  0.070000   0.000000   0.070000 (  0.068171)
Numerical  0.100000   0.000000   0.100000 (  0.101828)

这是一个基准测试的代码,链接在这里:https://gist.github.com/sid-code/9ad26dc4b509bfb86810

2
我也认为split很慢...想和n.to_s.chars.map(&:to_i)进行比较吗? - Neil Slater
是的,我会选择 chars 这个选项,它既快速又优雅,两全其美。 - itdoesntwork
数值类型可以给你一些见解(我预计 Fixnum#to_s 内部也有类似的东西)。无论哪种方式,都是好答案。 - Neil Slater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接