从ruby中的数组中找出最小的未使用数字?

时间:2012-10-27 14:52:44

标签: ruby arrays

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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