Leetcode(137) Single Number II

Description

Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

1
2
Input: [2,2,3,2]
Output: 3

Example 2:

1
2
Input: [0,1,0,1,0,1,99]
Output: 99

解法

又是一个巧妙的位运算的题,对于每个数的二进制的每一位上的数相加,因为所有的数都出现了3次,除了1个数,那么如果这一位上的数的和不能被3整除,则那个只出现过一次的数的这一位一定是1,否则那一位是0。

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i = 0; i < 32; i++) {
int sum = 0;
for(int j = 0; j < nums.length; j++){
sum += (nums[j] >> i) & 1;
}
if(sum % 3 != 0){
res |= 1<<i;
}
else{
res |= 0<<i;
}
}
return res;
}
}