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?
思路:用变量分别存储出现一次、两次、三次的number
出现一次的number: 抑或操作去除了出现两次的可能,与未出现三次的number作“与操作”去除了出现三次的可能
出现两次的number:与出现一次的number作“与操作”
出现三次的number: 出现一次的number“与操作”出现两次的number
class Solution { public: int singleNumber(int A[], int n) { int once = 0; int twice = 0; for (int i = 0; i < n; i++) { twice |= once & A[i]; //将出现两次1的位,在twice中置1 once ^= A[i]; //将出现一次1的位,在once中置1,出现两次则置0 int not_three = ~(once & twice); //将出现三次1的位,在not_tree中置0 once = not_three & once; //将出现三次1的位,在once中置0 twice = not_three & twice; //将出现三次1的位,在twice中置0 } return once; } };