1. 題目
一個整型數組 nums 裏除兩個數字之外,其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
要求時間複雜度是O(n),空間複雜度是O(1)。
示例 1:
輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]
示例 2:
輸入:nums = [1,2,10,4,1,4,3,3]
輸出:[2,10] 或 [10,2]
限制:
2 <= nums <= 10000
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
類似題目:
LeetCode 136. 只出現一次的數字(異或^)
LeetCode 137. 只出現一次的數字 II(位運算)
2. 解題
- 對數組所有的值全部異或,得到想要求的兩個數的異或值
- 找到該異或值爲1的
bit
- 用該
bit
將數組的值分成兩組來,分別求取異或值,即得2個唯一的數
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int i, XOR = 0;
for(i = 0; i < nums.size(); ++i)
XOR ^= nums[i];
for(i = 0; i < 32; ++i)
{
if(XOR & (1<<i))
break;
}
int a = 0, b = 0;
for(auto& n : nums)
{
if(n&(1<<i))
a ^= n;
else
b ^= n;
}
return {a, b};
}
};