LEETCODE ALGORITHM:面试题56 - I. 数组中数字出现的次数

题目

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例 1:

1
2
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]

示例 2:

1
2
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

限制:

  • 2 <= nums <= 10000

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int r=0,ans1=0,ans2=0;
for(int n:nums) r^=n;
int t=1;
while((r&t)==0) t<<=1;
for(int n:nums)
{
if((n&t)==1) ans1^=n;
else ans2^=n;
}
return vector<int>{ans1,ans2};
}
};

如果一个数组除一个数字外都出现了两次,要找出这个唯一出现了一次的数只需要把所有的数异或即可,因为异或为不同为1,相同为0.所有出现两次的数异或后全部成了0。

如果增加到两个数就要想办法把两个出现了一次的数分到两组再异或。

先把所有数异或,结果为两个只出现了一次数的异或值,由于1表示两个数在该位的数不同,随便找一个为1的位置,以此为依据把数组分为两份,分别异或算出答案。