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?
位操作
设三个二进制数 one two three
one代表至少出现了一次的位
two代表至少出现了2次的位
three代表出现了3次的位
每次循环中 three为当前two和a[i]的&,代表two中有的位再次出现
two为之前two和one与a[i]的&的|,代表one中出现,当前又出现或者原来已经出现两次的位
one为之前one和a[i]的|
然后每次将one和two中,three为1的位清零
最后two three应当为0,one中剩余的位为出现一次的位
return one
public class Solution {
public int singleNumber(int[] A) {
int one=0;
int two=0;
int three=0;
for(int i=0;i<A.length;i++){
three=two&A[i];
two=two|one&A[i];
one=one|A[i];
one=one&(~three);
two=two&(~three);
}
return one;
}
}