数组#max中的NoMemoryError

时间:2017-10-07 07:08:24

标签: ruby enumerable

我正在处理代码问题,解析一个整数并按降序重新排序其数字。我的工作解决方案如下;我决定使用字符串方法快速解析数字(而不是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))?

2 个答案:

答案 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的内容,它应该是一个整数,以返回枚举中的项目数。无法解释内存错误,除非您通过传递一个长于可枚举长度的数字来滥用该方法。

http://ruby-doc.org/core-2.4.2/Enumerable.html#max