LeetCode 260 只出现一次的数字 III(超级清晰的解释)
给定一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入:[1,2,1,3,2,5]
输出:[3,5]
注意:
- 结果输出的顺序并不重要,对于上面的例子,
[5, 3]
也是正确答案。 - 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
【思路】左神这道题讲的十分清晰:
【代码】
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int dp = 0;
for(int num: nums)
dp = dp ^ num;
int s = 1;
while((dp & s) == 0)//找到最右侧的1,这一位表明这两个数的这一位一定不同
{
s = s<<1;
}
unsigned int res1 = 0, res2 = 0;
for(int num: nums)
{
if((num & s) == s)//只与这一位为1的数进行异或,最终得到的肯定为两个数中这一位为1的那个数
{
res1 = res1 ^ num;
}
}
res2 = res1 ^ dp;//因为 dp是 res1 ^ res2
return vector<int>{res1, res2};
}
};