個人認爲是Leetcode-136 只出現一次的數字的升級版
136中只有一個數字只出現一次,本題中有兩個
因此136的方法爲求異或和
,本題爲求異或和+分組
這個
分組
就是本題的關鍵點
例如:nums = [1,2,10,4,1,4,3,3]
異或和:ans=8
,ans反映了2和10 的不同位數
2:0001 10:0101 ans=8(0100)
取出任意一個不爲0的位,這裏是讓help與ans進行&運算尋找
使用help^nums[i]
進行分組
,相同的數一定會被分到一組,並且經過異或運算後消失,這樣兩個組的結果即爲只出現了一次的兩個數。
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int ans=nums[0];
int a=0,b=0,help=1;
for(int i=1;i<nums.size();i++)
ans=(ans^nums[i]);
while((help&ans)==0)
{
help=help<<1;
}
for(int i=0;i<nums.size();i++)
{
if((nums[i]&help)!=0)
a=a^nums[i];
else
b=b^nums[i];
}
return {a,b};
}
};