日期:2014-05-17  浏览次数:20497 次

如何快速在连续数字的中找出缺失数字
比如有个连续的数字,1,2,3,4,5....200,递增+1,如何在其中找出缺失的数字,比如1,2,4,5,7,8...200,缺失的就是3,6.
除了用放进数组,array[i]+1=array[i+1],这样来遍历,还有没什么更快的方式?

------解决方案--------------------
int[] array = new int[] { 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
var source = Enumerable.Range(1, 20).Where(t => !array.Contains(t)).ToArray();
foreach (var t in source)
{
Console.WriteLine(t);
}
------解决方案--------------------
二分查找?

我觉得肯定要放进数组了,先判断缺几个数字。因为已经排好序了,可以分成两半,再判断那边缺少数字了,再把缺少数字的部分再分成两半,依次类推。

算法是我的弱项,只能抛砖引玉了。
------解决方案--------------------
探讨
比如有个连续的数字,1,2,3,4,5....200,递增+1,如何在其中找出缺失的数字,比如1,2,4,5,7,8...200,缺失的就是3,6.
除了用放进数组,array[i]+1=array[i+1],这样来遍历,还有没什么更快的方式?

------解决方案--------------------
可以先判断缺失了几个数

然后遍历 达到缺失总数后就退出遍历
------解决方案--------------------
C# code

            int[] array = new int[] { 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
            var v = Enumerable.Range(1, 20).Except(array);
            foreach (var t in v)
            {
                Console.WriteLine(t);
            }

------解决方案--------------------

C# code
 int[] a = { 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
            int[] b = new int[21];
            for (int i = 0; i < a.Length; i++)
                b[a[i]] = 1;
            for (int i = 1; i < b.Length; i++)
                if (b[i] != 1)
                    Response.Write(string.Format("{0},", i) + "<br>");

------解决方案--------------------
分治吧,分两个区间,看每个区间缺几个。
缺的区间继续2分。不缺的区间不用处理。
这样递归下去。
------解决方案--------------------
这个遍历的时间复杂度很明显是较高的,用二分法查找吧,总体上来说效率会高一点……
其实这里我觉得在使用二分法的时候,不要那么死板,可以考虑一下上面说的,同时分区间,看区间长度,进行查找(这里说白了,还是二分法)
------解决方案--------------------
C# code

 int[] array = new int[] { 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
int x=1;//标识初值
for(int i=0;i<array.length;i++)
{
if(array[i]!=x)
{
Console.WriteLine(array[i]);
i--;//如果此位置缺失则继续判断此位置的数
}
x++;//增量
}

------解决方案--------------------
int[] array = new int[] {12, 13, 14, 15, 16, 17, 18, 19, 20 };
var result = Enumerable.Range(1, 20).Except(array);
------解决方案--------------------
常用的方法就是这个建立连续的整形数组了。