# leetcode Single Number II

587人阅读 评论(0)

### Single Number II

Total Accepted: 4273 Total Submissions: 14218

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];
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：277349次
• 积分：4651
• 等级：
• 排名：第6532名
• 原创：152篇
• 转载：233篇
• 译文：0篇
• 评论：6条
文章分类
阅读排行
评论排行
最新评论