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?
思路:因为int类型的数最多32位,我们可以用一个32位的数组记录下将这组数字转化为2进制,每一位上的和
因为出现3次的肯定可以被3整除了,没一位余下的都是这个没有出现三次的这个数的部分
比如 一组数字 8 8 8 2 2 2 4 7 7 7
8-->1000
2-->0010
4-->0100
7-->0111
每一个二进制位加起来
bit[4~31]=0;
bit[0]=1*3=3;
bit[1]=1*3+1*3=6;
bit[2]=1*1+1*3=4
bit[3]=1*3=3;
每一位除以3,剩下的是0100=4,就是我们要找的那个数
代码如下(已通过leetcode)
public class Solution {
public int singleNumber(int[] nums) {
int[] bitmap=new int[32];
for(int i=0;i<32;i++) {
for(int j=0;j<nums.length;j++) {
bitmap[i]=bitmap[i]+((nums[j]>>i)&1);
}
}
int res=0;
for(int i=0;i<32;i++) {
res|=(bitmap[i]%3)<<i;
}
return res;
}
}