一、题目
二、题解
讲数组中所有值进行异或,最终得到的值里面其实是两个只出现一次的值异或得到,我们可以找到这两个值异或后低位的第一个1,然后讲数组分为两块:这一位是1的和这一位是0的,然后分别异或(类似 题目:数组中只出现一次的数)即可得到
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& nums) {
// write code here
int res = 0;
for (auto x : nums) res ^= x; // 异或所有值
int idx = 0; // 寻找低位为1的位置
while (true) {
if ((1 << idx) & res) break;
idx++;
}
int ans1 = 0, ans2 = 0; // 分类
for (auto x : nums) {
if (x & (1 << idx)) ans1 ^= x;
else ans2 ^= x;
}
if(ans2 < ans1) return {ans2, ans1};
else return {ans1, ans2};
}
};