0

给一个数组,如何找到下一个未使用的数字?

["10", "2", "3", "5", "6", "7"],它应该返回"4"

["1", "2", "3"],它应该返回"4"

4

3 回答 3

2

干得好:

def next_unused(ary)
    sary = ary.collect(&:to_i).sort
    i = 0
    s = sary[0]
    # puts "ary: #{sary.inspect}, s: #{s}"
    while (i<sary.size && (s == sary[i])) do
        # puts "s:#{s}, sary:#{sary[i]}"
        s += 1
        i += 1
    end
    s.to_s
end
于 2012-10-27T14:58:50.953 回答
2

与显式循环和累加器变量相比,使用高阶函数通常会导致更简洁和优雅的解决方案......

require 'set'
used = ["1","2","3"].map(&:to_i).to_set
1.upto(Float::INFINITY).detect { |n| not used.include?(n) }

Set即使在您有很多“已使用”数字的情况下,使用 a也可以使该解决方案快速运行。如果您知道永远不会有很多“已使用”数字,则可以跳过将已使用数字数组转换为集合。#include?也适用于数组。

于 2012-10-27T15:16:41.513 回答
1

也许像这样?

a = ["10", "2", "3", "5", "6", "7"]
actual = a.map(&:to_i)
full = ((actual.min)..(actual.max)).to_a

p (full - actual).first
#=> 4

a = ["1", "2", "3"]
p a.map(&:to_i).max + 1
#=> 4    
于 2012-10-27T15:27:02.620 回答