剑指offer-数组中只出现一次的数字
一、题意
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
二、思路
题目一直在强调一个(或两个)数字只出现一次,其他的出现两次。可以联想到异或运算。异或的一个性质是:任何一个数字异或它自己都等于0。如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字。
那么如何在一个数组中找到两个只出现一次的数字呢?如果可以将原始数组分成两个子数组,使得每个子数组包含一个只出现一次的数字,而其他数字都成对出现。就可以用上述方法找到出现一次的数字。
从头到尾一次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数组的异或结果。因为其他数字都出现了两次,在异或中全部抵消了。由于两个数字肯定不一样,那么异或的结果肯定不为0,也就是说这个结果数组的二进制表示至少有一个位为1。我们在结果数组中找到第一个为1的位的位置,记为第n位。现在我们以第n位是不是1为标准把元数组中的数字分成两个子数组,第一个子数组中每个数字的第n位都是1,而第二个子数组中每个数字的第n位都是0。
三、代码实现
1 | package main |
- 本文标题:剑指offer-数组中只出现一次的数字
- 本文作者:beyondhxl
- 本文链接:https://www.beyondhxl.com/post/b9b525c6.html
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!