在数组中找到最低正缺失整数

时间:2015-03-31 11:25:15

标签: ruby arrays

我的数组是这样的整数:

[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中管理它?

6 个答案:

答案 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)

  1. 对数组进行排序
  2. 迭代数组并将每个项目的值与当前索引+ 1进行比较,如果该对不相等,则找到最低可用整数,即索引+ 1.

答案 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添加到最小数字