ACWING73. 数组中只出现一次的两个数字(剑指offer)

一个整型数组里除了两个数字之外,其他的数字都出现了两次。

请写程序找出这两个只出现一次的数字。

你可以假设这两个数字一定存在。

样例
输入:[1,2,3,3,4,4]

输出:[1,2]

思路:
简单的思路是花额外空间。

题解是利用异或运算:

  1. 一个数被异或两次为0
  2. 全部异或一遍得到sum = x ^ y
  3. 取k,保证sum第k位为1
  4. 再次遍历vector,如果第k位为1则异或该数。操作完毕后,结构即为第一个答案
  5. 第二个答案就是sum 异或上 第一个答案。
class Solution {
public:
    vector<int> findNumsAppearOnce(vector<int>& nums) {
        int sum = 0;
        for(auto x: nums) {
            sum ^= x;
        }
        int k = 0;
        while(!((sum >> k) & 1)) k++;
        int ans = 0;
        for(auto x: nums) {
            if((x >> k) & 1) ans ^= x;
        }
        
        return vector<int>{ans,sum ^ ans};
    }
};
发布了843 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/104996973