我的数组是这样的整数:
[1, 2, 3, 6, 10]
我的问题是获得此数组中尚未包含的最低正整数的最简单方法是什么?
类似的东西:
[1, 2, 3, 6, 10].lowest_available => 4
[1, 8, 3, 6, 10].lowest_available => 2
[5, 8, 3, 6, 10].lowest_available => 1
有没有人知道如何在ruby中管理它?
答案 0 :(得分:3)
最低i表示>>的整数。 0并且尚未在数组中
基本上,您在排序时正在寻找与index+1
不等于的第一个值。这里:
def lowest_available(arr)
res = nil
arr.sort.each.with_index(1) { |a, i|
if i != a
res = i
break
end
}
res
end
lowest_available([1, 2, 3, 6, 10])
# => 4
lowest_available([1, 8, 3, 6, 10])
# => 2
lowest_available([5, 8, 3, 6, 10])
# => 1
<强>更新强>
通过返回值和break
可以缩短上述方法。 (正如Cary和Stefan在下面的评论中所建议的那样)。
def lowest_available(arr)
arr.sort.find.with_index(1) { |a, i| break i if i != a }
end
答案 1 :(得分:3)
class Array
def lowest_available; (1..Float::INFINITY).find{|e| include?(e).!} end
end
[1, 2, 3, 6, 10].lowest_available # => 4
[1, 8, 3, 6, 10].lowest_available # => 2
[5, 8, 3, 6, 10].lowest_available # => 1
或者,正如Stefan所说:
class Array
def lowest_available; 1.step.find{|e| include?(e).!} end
end
答案 2 :(得分:2)
不那么优雅,但是如果您的数组很小,您可以创建整个整数数组并使用Array#-
来找出差异:
def lowest_available(arr)
((1..arr.size).to_a - arr).first
end
lowest_available([1, 2, 3, 6, 10]) #=> 4
lowest_available([1, 8, 3, 6, 10]) #=> 2
lowest_available([5, 8, 3, 6, 10]) #=> 1
答案 3 :(得分:0)
答案 4 :(得分:0)
另一种方式(已经晚了):
def first_missing(a)
a.reduce(0) { |tot,n|
exp=expected(tot); return exp if n>exp; tot + n }
end
def expected(tot)
((-1.0 + Math.sqrt(1.0+8*tot))/2).round + 1
end
first_missing([1, 2, 3, 6, 10]) #=> 4
first_missing([1, 8, 3, 6, 10]) #=> 2
first_missing([5, 8, 3, 6, 10]) #=> 1
答案 5 :(得分:0)
有一种非常简单的方式
def lowest_available (array)
min = array.min
max = array.max
number = (min..max).to_a - array
number = array.select { |v| v>0 }
number = number.min + 1
end
我正在做的是创建另一个数组,其中包含相关数组间隔中的所有数字。 完成后,我从创建的数组中删除原始数组 然后我将1添加到最小数字