LeetCode 260. 只出现一次的数字 III(Single Number III)
题目描述
给定一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:
- 结果输出的顺序并不重要,对于上面的例子,
[5, 3]
也是正确答案。 - 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
解题思路
利用找单独出现一次数字的解题思路,将所有数字异或,这样得到的就是两个出现一次数的异或结果。然后从右往左找到异或结果数位第一位为1的位置,然后关于此位是否为1将数组分为两部分,这样两个数字分别分到了两部分,并且每部分里的其他数都成对出现。再对两部分分别异或运算,得到的结果便是两个出现一次的数。
代码
1 class Solution { 2 public: 3 vector<int> singleNumber(vector<int>& nums) { 4 vector<int> res; 5 int xo = 0; 6 for(int num: nums) 7 xo ^= num; 8 int idx = 0; 9 while(((xo >> idx) & 1) == 0) idx++; 10 int res1 = 0, res2 = 0; 11 for(int num: nums){ 12 if((num >> idx) & 1) res1 ^= num; 13 else res2 ^= num; 14 } 15 res.push_back(res1); 16 res.push_back(res2); 17 return res; 18 } 19 };