【发布时间】:2013-02-13 16:33:32
【问题描述】:
我想知道这个算法是否有一个正式的名称,以及解决这个问题的优雅方法是什么:问题是——给定一个数组,比如[3, 6, 2],打印出所有以000开头的数字, 100、200、300,那么下一个数字将“结转”并变为010,然后是110。它就像汽车的里程表,只是增加另一端的数字就可以了。 6 是第二个数字的最大数字。 2 是第三位的最大数字。所以程序应该打印出362 作为最后一个数字。
我想出了下面的解决方案,但它看起来太乱了。所以我想知道是否有一个优雅的解决方案,这个问题和解决方案实际上是否有一个正式的名称和一个已知的优雅解决方案来解决它?
递归实际上是可能的,但我认为如果递归返回一个包含所有数字的数组,如果输入数组中有 10 或 15 个数字,算法将无法处理它,因为结果数组可以增长成倍增长,它会变得非常大并占用大量内存。
# In Ruby
def print_all_numbers(arr_ranges)
arr = arr_ranges.map { 0 } # convert it to [0, 0, 0]
while (true)
incrementer_index = 0
puts arr.join
arr[incrementer_index] += 1
while arr[incrementer_index] > arr_ranges[incrementer_index]
arr[incrementer_index] = 0
incrementer_index += 1
return if incrementer_index >= arr.length
arr[incrementer_index] += 1
end
end
end
print_all_numbers([3, 6, 2])
【问题讨论】:
标签: algorithm