Total Accepted: 25496
Total Submissions: 59777
Difficulty: Medium
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?
如题 ,在只有两个数出现一次,其余数都出现两次的数组中,找出这两个数字 。
思路如下
两个相同的数异或为0 ,所以把,整个数组异或就得到了要求两个数的异或result;
因为异或是1^0 = 1 ,0 ^1 = 1 , 1^1 = 0 ,0^0 = 0 ;
找到result二进制位当中第一个出现 1 时的位数,并以此作为判断条件分开这个两个数,在分别异或这两个部分,就可得到答案 。
代码如下 :
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int>res ;
int result=0 ;
int tmp1= 0 , tmp2 = 0 ;
for (int i = 0 ; i < nums.size() ; i++ )
result ^= nums[i]; // 所求两个数的异或结果
int i = 0 ;
while ( ((result >>i) & 1) != 1 ){ //(result>>i)&1 是求result二进制当中的第i+1位的值 ,
//一定要在!= 前面加括号,因为!=的优先级大于位运算,开始便在这个地方错了无数次,纠结。
i++ ; } // 找到第几位出现了 1 ;
for(int j =0 ; j < nums.size() ; j++ )
if ( (nums[j] >> i ) &1 ) // 以此作为判断条件将数组分开两部分,每部分含有一个所求的值,然后不断异或得答案
tmp1 ^= nums[j];
else
tmp2 ^= nums[j];
res.push_back(tmp1);
res.push_back(tmp2);
return res ;
}
};