0

配列を与えて、次の未使用の番号を見つける方法は?

["10", "2", "3", "5", "6", "7"]、返されるはずです"4"

["1", "2", "3"]、返されるはず"4"です。

4

3 に答える 3

2

高階関数を使用すると、一般に、明示的なループやアキュムレータ変数よりも簡潔で洗練されたソリューションになります。

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

を使用するSetと、「使用済み」の番号が非常に多い場合でも、このソリューションをすばやく実行できます。「使用済み」の数値が多くなることがないことがわかっている場合は、使用済みの数値の配列をセットに変換することをスキップできます。#include?配列でも機能します。

于 2012-10-27T15:16:41.513 に答える
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 に答える
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 に答える