假设我有一个数字列表,每个列表都是唯一且有序的:
List<int> list = new List<int>
{0, 1, 3, 4, 9, 10, 15};
然后我想添加一个新号码,号码必须是唯一的,它的值应该是可以插入列表“洞”中的最小值。
在这种情况下,第一个新号码应 2 ,然后 5 ,然后 6 ,......
另一个例子,如果列表是:
{0, 1}
然后新号码应 2
你有一些好主意实现这个算法,谢谢。
答案 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);