Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
- The order of the result is not important. So in the above example,
[5, 3]
is also correct. - Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int>::iterator it = nums.begin();
vector<int> result;
if (nums.size() == 2){
return nums;
}
int temp = *it;
it++;
for (; it != nums.end(); it++){
temp = temp ^ (*it);
}
int ex = temp;
int pos = 0x00000001;
if (temp<0){
ex = 0x80000000;
}
else{
while ((ex&pos)==0){
pos=pos<<1;
}
ex = pos;
}
int ans1 = 0;
int flag=0;
for (it = nums.begin(), flag=0; it != nums.end(); it++){
if (((*it)&ex) == 0){
if (flag==0){
ans1 = *it;
flag=1;
}else{
ans1 = ans1 ^ (*it);
}
}
}
int ans2 =0;
for (it = nums.begin(),flag=0; it != nums.end(); it++){
if (*it != ans1){
if (flag==0){
ans2 = *it;
flag=1;
}else{
ans2 = ans2 ^ (*it);
}
}
}
result.push_back(ans1);
result.push_back(ans2);
return result;
}
};
思路心得:
这一题的代码略显凌乱,但是思路和singlenumber1的思路相近的(可能会有更好的方法)
就是将所有的数按位相与就可以得出两个落单数字的按位与的结果
而这个按位与的结果每一位必然不全为0,因为至少有两个数字是相互不同的。
而且这个结果中的某一位的1只会出现在其中的一个结果身上。
所以在第二次循环当中将该结果中的某个位置的1抽取出来
丢弃在该位置上有1的所有数字再做一次所有数字的按位与。就一定能够获得答案1
再剔除答案1,就能够用singlenumber的方法获得答案2
固定是三次循环所以时间复杂度还是O(n)