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?
共3n+1个数, 只有一个是single, 其余的数都是三个相同的
如 1 1 1 2 2 2 4 5 5 5
需要找出4
class Solution { public: int singleNumber(int A[], int n) { int x[32]; memset(x, 0, sizeof(x)); for (int i = 0; i < n; i++) { for (int j = 0; j < 32; j++) { x[j] += (A[i] >> j) & (1); x[j] %= 3; } } int res = 0; for (int i = 0; i < 32; i++) { res += (x[i] << i); } return res; } };
class Solution { public: int singleNumber(int A[], int n) { int ones = 0, twos = 0, xthrees = 0; for(int i = 0; i < n; ++i) { twos |= (ones & A[i]); ones ^= A[i]; xthrees = ~(ones & twos); ones &= xthrees; twos &= xthrees; } return ones; } };
此解法是参考大神的, 确实高明, 二进制模拟三进制
t1 = A^B 余2位, 称余位, 如果是1, mod2=1
此题甚是巧妙
ones 存储 mod3 = 1
twos 存储 mod3 =2
threes 是 mod3 = 0
threes求法 ones & twos 即两者都为1才是1, 即2+1
然后取反, 目的是更新ones和twos中的数位
class Solution { public: int singleNumber(int A[], int n) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. map <int, int> mp; map <int, int>::iterator it; for(int i = 0;i < n;i++){ it = mp.find(A[i]); if(it == mp.end()){ mp[A[i]] = 1; } else mp[A[i]]++; } for(it = mp.begin();it != mp.end();it++){ if((*it).second != 3) return (*it).first; } } };