题目:落单的数II
要求:
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。
样例:
给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4
算法要求:
一次遍历,常数级的额外空间复杂度
解题思路:
这道题就不能像上一道题那样,用异或来将二个相同的数抵消,但是我们可以使用同样的原理,在位上进行操作,实现出现三次则抵消。
算法如下:
class Solution {
public:
/*
* @param A: An integer array
* @return: An integer
*/
int singleNumberII(vector<int> &A) {
// write your code here
int n[32] = {0};
int size = A.size();
for (int i = 0; i < size; i++) {
for (int j = 0; j < 32; j++) {
n[j] = (n[j] + ((A[i] >> j) & 1)) % 3;
}
}
int base = 1;
int a = 0;
for (int i = 0; i < 32; i++) {
a += n[i] * base;
base *= 2;
}
return a;
}
};