我正在处理代码问题,解析一个整数并按降序重新排序其数字。我的工作解决方案如下;我决定使用字符串方法快速解析数字(而不是mods或log_10s):
# descending_order : int => int
# Takes an int, re-orders its digits in descending order, and returns that
# ex. descending_order(1234) => 4321
def descending_order(n)
n.to_s.chars.sort.reverse.join.to_i
end
但是,在使用该解决方案时,我还尝试了以下变体,它为NoMemoryError
提供了相当小的输入:
def descending_order(n)
n.to_s.chars.max(n).join.to_i
end
的产率:
descending_order(456454576895645)
NoMemoryError: failed to allocate memory
from (pry):129:in `max'
显然,sort
是在max(<array_length>)
上对数组进行排序的正确方法,但我很好奇为什么max
会占用这么多内存。是什么导致了这种行为,我是否需要小心类似的情况(例如,从100个整数的数组中取出max(20))?
答案 0 :(得分:4)
如记录here,如果给出n,则返回最多n个元素,实质上也分配大小为n的数组,这是NoMemoryError的原因。
答案 1 :(得分:0)
def descending_order(n)
str_num_arr = n.to_s.chars
str_num_arr.map(&:to_i).max(str_num_arr.length)
end
请参阅rubydocs以获取传递给max的内容,它应该是一个整数,以返回枚举中的项目数。无法解释内存错误,除非您通过传递一个长于可枚举长度的数字来滥用该方法。