原题:
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?
代码:
class Solution {
public:
int singleNumber(int A[], int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int bits[32] = {0};
for(int i=0 ; i<n ; i++){
for(int j=0 ; j<32 ; j++){
bits[j] = ((A[i]>>j) & 1 )+ bits[j];
bits[j] = bits[j] % 3;
}
}
int ret = 0;
for(int i=31 ; i>=0 ; i--){
ret = ret*2 + bits[i];
}
return ret;
}
};
其中,最后的根据bits[]求ret。也可以用以下方法:
for(int i=0 ; i<32 ; i++){
ret = ((bits[i])<<i) + ret;
}
或者(从位运算角度)
for(int i=0 ; i<32 ; i++){
ret = ((bits[i])<<i) | ret;
}
总结:开始时不会做本题,参考网上其他人的解答后自己写的代码。主要思路是,用含32个元素的数组分别记录每位出现的1的次数(要么为1,要么为3的倍数),最后所有为1的各位组成的数即为所求。时间复杂度O(32n) = O(n),空间复杂度为O(32)=O(1)。
这种方法的可扩展性非常强,适用于本题的其他变种,如之前的Single Number。