原题链接在这里:https://leetcode.com/problems/single-number-ii/
这道题的关键就是要求no extra memory space. 所以就用到了bit manipulation.
思路就是维护一个32位的数组,因为int 都是32位的,外层loop是对应每一位,内层loop是算所有的数在这一位上出现次数的和。
Mod 3 后剩下的就是那个只出现了一次的数。
Note: 1. Check if current bit is 1 using:
nums[j] >> i & 1
但要注意的是bit operator >> & 都比 == operator 运算级别低,所以要加括号。
2. 给了一个array代表2进制的数,转化成10进制的数就是用
res += bitCounter[i]<<i
AC Code:
public class Solution {
public int singleNumber(int[] nums) {
if(nums == null || nums.length == 0){
return Integer.MIN_VALUE;
}
int res = 0;
int [] bitCounter = new int[32];
for(int i = 0; i < 32 ; i++){
for(int j = 0 ; j < nums.length; j++){
if((nums[j]>>i&1) == 1){ //error
bitCounter[i]= (bitCounter[i] + 1)%3;
}
}
}
for(int i = 0; i < 32; i++){
res += bitCounter[i]<<i;
}
return res;
}
}