如何查找列表中没有的第一个正整数

时间:2015-08-31 10:25:15

标签: c# algorithm list

假设我有一个数字列表,每个列表都是唯一且有序的:

List<int> list = new List<int>
  {0, 1, 3, 4, 9, 10, 15};

然后我想添加一个新号码,号码必须是唯一的,它的值应该是可以插入列表“洞”中的最小值。

在这种情况下,第一个新号码应 2 ,然后 5 ,然后 6 ,......

另一个例子,如果列表是:

{0, 1}

然后新号码应 2

你有一些好主意实现这个算法,谢谢。

3 个答案:

答案 0 :(得分:2)

var list = new[] { 0, 1, 3, 4, 9, 10, 15 };
var holes = Enumerable.Range(0, list.Max()+2).Except(list).ToList();

答案 1 :(得分:2)

只需排序列表,然后检查:

List<int> list = new List<int> {
  0, 1, 3, 4, 9, 10, 15
};

// if the list is ordered, you don't need this
list.Sort();

// if list is dense 
int result = list[list.Count - 1] + 1;

// check for "holes", providing that list values are unique (list[i - 1] != list[i])
for (int i = 1; i < list.Count; ++i)
  if (list[i - 1] + 1 != list[i]) {
    result = list[i - 1] + 1;

    break;
  }

答案 2 :(得分:1)

如果我理解正确,您希望找到列表中没有的第一个正整数。 (因为你正在使用&#34;&#34;第一个号码,我假设你不需要一个包含所有漏洞的数字数组。)

你这样做的方法是(假设数组按你的例子​​排序)只需从零开始并加一,直到数组不包含数字:

int[] arrayWithNumbers = new int[] {0, 1, 3, 4, 9, 10, 15};

int i = 0;
while (arrayWithNumbers.Contains(i)) //check if number already exists in array
{
    i++; //increment by 1
}

Console.WriteLine(i);