Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
总体而言,都是以异或为二进制加法为原则,使用二进制计数的原理来解决single number。
使用了三进制异或的方法实现,采取两个值c1
c2
分别存储结果中每位对应的两个标识位(可以储存四种状态,最多实现四进制异或),代码如下。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int c1 = 0, c2 = 0;
for (int i = 0; i < nums.size(); ++i){
c2 = c2 ^ (nums[i] & c1);
c1 = c1 ^ (nums[i]);
int mask = ~(c1 & c2);
c2 = c2 & mask;
c1 = c1 & mask;
//cout << c2 << " " << c1 << endl;
}
return c1;
}
};