经典面试题————消失的数字

该博客介绍了如何在O(N)时间内解决LeetCode的一道面试题,即在一个从0到n的整数数组中找出缺失的数字。作者提供了三种解法,包括求和法和两种位运算法。位运算解法利用异或运算的性质,通过将所有数与0到n的整数异或,最终得到的结果即为缺失的数字。这种方法在时间复杂度上优于排序后的线性查找法。
摘要由CSDN通过智能技术生成

一,题目

backgroud:数组nums包含从0到n的所有整数,但其中缺了一个。

question: 请在O(N)时间内找出该缺失的整数。


原题在此:

二,解法

解法一:(求和)

1.把该缺失数组当成完整数组进行求和(sum 1)

(1+2+3+4.......+n等差数列求和)(Sn=【(1+n)n】/2)

2.缺失数组(题目已给)中的值进行累加(sum 2)

3.两者相减(sum 1-sum 2)

该解法时间复杂度O(N)

代码如下:

解法二:(位运算求解)

1.x=0

2.x跟0-n之间数异或

3.x再跟数组中的值异或

4.return返回的那个数即为所缺失的数

思路:

        题意为数字从[0,n]之间的n+1个数字中少了一个,如果我们补全该数组,那么除了缺失的数字,其余均成对出现,利用位运算的规律即可找出缺失的数。

关于位运算有如下几个规律:

1^1=0

1^0=1

0^1=1

0^0=0

也就是说0和1异或时相同的异或结果为0,不同的异或结果为1,根据上面的规律可得:

a^a=0;                  (自己和自己异或等于0)

a^0=a;                  (任何数字和零异或还是它本身)

a^b^c=a^c^b;          (异或运算具有交换率)

利用这三个规律,这道题就迎刃而解了,只需要把所有的数字都异或一遍,最终的结果就是消失的那个数字

该解法时间复杂度为O(N)

代码如下:

相当于x=0^nums[i]^i

   当num【i】与i相等时,异或为零,除了缺失的数,其他的数字都有伴,所以缺失数字最后会被剩下,赋于x,然后return x,该数组缺失数字就找到了

第一个for循环把除缺失数以外的其他数一个个拎出来,拎出来的一个个去第二个for循环中和【0~n】异或,找到和自己相同的数,便被异或为0

最终x=0^消失的数字^0^0^0^0^0^0^0^0^0.......^0

于是消失的数字便找到了

解法三:

(该解法的时间复杂度为O(N*logN),虽不符合题中O(N)的要求,但该思路值得写一写)

1,给该数组由小到大排序(qsort快排)

2,一次查找出一个数,查找出的数加一,看是否等于下一个数

3,若等于就继续,不等于查找出的数加一就是缺失的数字

附上一张复杂度对比表:

可见复杂度O(N)比复杂度O(Nlog*N)的代码优化的不是一星半点。

(The End)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值