leetcode 260 只出现一次的数字III
一、题目描述
二、解题思路
整体思路:
可以采用位运算的思想,加上运算律a^a=0,0^a=a可以解决这个问题。
具体思路:
(1)首先,将nums数组中的所有数进行异或;
(2)r=r&(-r)来提取出r中最右边的1(其实任意位置的1均可),由异或的运算律a^a=0可知,最右边的1对应的二进位制位的1一定是只出现一次的两个数异或产生的,即这两个数在这一位的二进制数不同;
(3)因此,我们可以根据此二进制位进行分组异或,即可找到两个只出现一次的数。因为a^a=0,0^a=a,所有出现偶数次的数会被成对消除。
三、代码实现
时间复杂度:T(n)=O(n)
空间复杂度:S(n)=O(1)
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {//提取nums所有数异或long long r=0;for(auto x:nums) r=r^x;//提取最右边的1r=r&(-r);int a=0,b=0;//分组异或for(auto x:nums){if((x&r)==0) a^=x;else if((x&r)!=0) b^=x;}return {a,b};}
};