LeetCode题解:寻找缺失的整数(异或运算)

寻找缺失的整数

题目

一个无序数组里有99个不重复正整数,范围从1到100,唯独缺少一个整数。如何找出这个缺失的整数?

  • 解法1:

    创建一个哈希表,以1到100这100个 整数为Key。然后遍历整个数组,每读到-一个整数,就定位到哈希表中对应的Key,然后删除这个Key。

    由于数组中缺少1个整数,哈希表最终一定会 有99个Key被删除,从而剩下1个唯一的Key。这个剩下的Key就是那个缺失的整数。

    假设数组长度是n,那么该解法的时间复杂度是0(n),空间复杂度是0(n)。

缺点: 时间上是最优的,但是额外开辟了内存空间

  • 解法2:

    先把数组元素从小到大进行排序,然后遍历已经有序的数组,如果发现某两个相邻元素并不连续,说明缺少的就是这两个元素之间的整数。

    假设数组长度是n,如果用时间复杂度为O(nlogn)的排序算法进行排序,那么该解法的时间复杂度是O(nlogn),空间复杂度是0(1)。

缺点:没有额外开辟空间,但是时间复杂度又太大了

  • 解法3:

    这是一个很简单也很高效的方法,先算出1+2+3+…+100的和, 然后依次减去数组里的元素,最后得到的差值,就是那个缺失的整数。

    假设数组长度是n,那么该解法的时间复杂度是0(n),空间复杂度是0(1)。

问题扩展

  • 题目
    一个无序数组里有若干个正整数,范围是1-100,其中99个整数都出现了偶数次,只有1个整数出现了奇数次,如何找到这个出现奇数次的整数?

  • 思路关键:异或运算(相同为0,不同为1)
    只需要把数组里所有元素依次进行异或运算,最后得到的就是那个缺失的整数!

在这里插入图片描述

  • 解法:时间复杂度:O(n),空间复杂度:O(1)

遍历整个数组,依次做异或运算。由于异或运算在进行位运算时,相同为0, 不同为1,因此所有出现偶数次的整数都会相互抵消变成0,只有唯一出现 奇数次的整数会被留下。

让我们举一个例子: 给出一个无序数组{3,1,3,2,4,1,4}。

异或运算像加法运算一样,满足交换律和结合律,所以这个数组元素的异或运算的结果如下所示。

3 xor 1 xor 3 xor 2 xor 4 xor 1
= 1 xor 1 xor 3 xor 3 xor 4 xor 4
=2

问题:如果数组里有2个整数出现了奇数次,其他整数出现了偶数次,则如何找出这2个整数呢?

题目第2次扩展:

题目

假设一个无序数组里有若干个正整数,范围是1~ 100,其中有98个整数出现了偶数次,只有2个整数出现了奇数次,如何找到这2个出现奇数次的整数?

  • 思路关键:分治法(把数组元素依次进行异或运算,得到的结果是2个出现了奇数次的整数的异或运算

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值