数组中的 NoMemoryError#max
NoMemoryError in Array#max
我正在研究一个代码战问题来解析一个整数并按降序重新排列它的数字。我的工作解决方案如下;我决定使用字符串方法来快速解析数字(而不是 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))?
如文档所述here,如果给定 n,则返回最多 n 个元素,本质上也是分配大小为 n 的数组,这就是 NoMemoryError 的原因。
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 的内容,它应该是 return 可枚举项数的整数。无法解释内存错误,除非您通过传递一个长于可枚举长度的数字来滥用该方法。
我正在研究一个代码战问题来解析一个整数并按降序重新排列它的数字。我的工作解决方案如下;我决定使用字符串方法来快速解析数字(而不是 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))?
如文档所述here,如果给定 n,则返回最多 n 个元素,本质上也是分配大小为 n 的数组,这就是 NoMemoryError 的原因。
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 的内容,它应该是 return 可枚举项数的整数。无法解释内存错误,除非您通过传递一个长于可枚举长度的数字来滥用该方法。