在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
思路:
因此对于每个位置而言在遍历的过程中对3的余数只有可能出现三种情况0,1,2,其二进制表达分别为00,01,10。无法通过一个二进制位表达,所以需要两个二进制位,记为twos和ones。
所以每个位置总共只有可能是三种情况:twos为0,ones为0或1;twos为1,ones为0;
先看ones位置:ones=(ones^n)&(~twos)
解释:对于ones位置而言,当twos为1的时候,其必然为0;
当twos为0的时候,ones^=n;
先看twos位置:twos=(twos^n)&(~ones)
解释:对于twos位置而言,当ones为1的时候,其必然为0;
当ones为0的时候,twos^=n;
class Solution {
public:
int singleNumber(vector<int>& nums) {
int twos=0,ones=0;
for(auto& k:nums){
ones=(ones^k)&(~twos);
twos=(twos^k)&(~ones);
}
return ones;
}
};