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?
Similar to I, when the number accumulates for three times, set the bit to 0. I.e., how to simulate a ternary system using a binary system.
I wrote an wrong code like :
class Solution {
public:
int singleNumber(int A[], int n) {
int ones = 0, twos = 0, threes = 0, i, res = 0;
if (n == 1)
return A[0];
for (i = 0; i < n; ++i) {
res |= A[i];
threes = twos & A[i];
res ^= threes;
twos = (twos | (ones & A[i])) ^ threes;
ones = ones ^ A[i];
}
return res;
}
};
The mistake is that the variable ones needs to be cleared based on the variable threes. At the same time, the variable res seems redundant. A right code is :
class Solution {
public:
int singleNumber(int A[], int n) {
int ones = 0, twos = 0, threes = 0, i, res = 0;
if (n == 1)
return A[0];
for (i = 0; i < n; ++i) {
//res |= A[i];
threes = twos & A[i];
//res ^= threes;
twos = (twos | (ones & A[i])) & (~threes);
ones = (ones ^ A[i]) & (~threes);
}
return ones;
}
};
However, the code seems not in a standard way. I tried to fix the code in an accessible code:
class Solution {
public:
int singleNumber(int A[], int n) {
int ones = 0, twos = 0, threes = 0, mask = -1, i, res = 0;
if (n == 1)
return A[0];
for (i = 0; i < n; ++i) {
//res |= A[i];
threes = twos & A[i];
//res ^= threes;
mask = (~threes);
twos = (twos | (ones & A[i])) & mask;
mask &= (~twos);
ones = (ones | A[i] ) & mask;
}
return ones;
}
};
At last, the problem could be changed like this:
Given an array of integers, every element appears m times except for one for n times. Find that the one of n times.
int findNumber(int A[], int size, int m, int n) {
int mask = -1, i, j;
vector<int> times(m+1,0);
for (i = 0; i < size; ++i) {
mask = times[0] = -1;
times[m] = 0;
for (j = m; j >= 1; --j) {
times[j] = (times[j] | (times[j-1] & A[i])) & mask;
mask &= (~times[j]);
}
}
return times[n];
}