Single Number II
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?
要使用O(1)的空间解决这个问题,就要考虑到这些数是如何在计算机中存储的。
如果将所有数的第i个比特位加起来对3求余,余数要么是0要么是1,因为每个数字都只会出现3次或1次,这个余数就是要求的这个数的第i个比特位。
所以一种比较直接的实现方法就是使用32位数组存储第i个比特位。
class Solution{
public:
int singleNumber(int A[],int n){
int count[32]={0};
int result=0;
for(int i=0;i<32;i++){
for(int j=0;j<n;j++){
if((A[j]>>i)&1){
count[i]++;
}
}
result|=((count[i]%3)<<i);
}
return result;
}
};
介于此,我们还可以只用3个变量对以上代码进行优化:即用二进制模拟三进制的运算
1、ones变量代表第i个比特位出现1次有哪些二进制位;
2、twos变量代表第i个比特位出现2次有哪些二进制位;
3、threes变量代表第i个比特位出现3次有哪些二进制位。
当第i个比特位出现3次时,将ones和twos的第i个比特位清成0,最后剩下的ones就是答案。
class Solution{
public:
int singleNumber(int A[],int n){
int ones=0,twos=0,threes=0;
for(int i=0;i<n;i++){
twos|=ones&A[i];
ones^=A[i];
threes=ones&twos;
ones&=~threes;
twos&=~threes;
}
return ones;
}
};
原文见: http://oj.leetcode.com/discuss/857/constant-space-solution