题目描述:给一个数组,有一个数出现了两次或者1次,而其他数都出现了三次,找出这个数。其实对应了leetcode 137。
网上的解法多是位运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public int singleNumber( int [] nums) {
int ans = 0 ;
for ( int i = 0 ; i < 32 ; i++) {
int sum = 0 ;
for ( int j = 0 ; j < nums.length; j++) {
if (((nums[j] >> i) & 1 ) == 1 ) {
sum++;
sum %= 3 ;
}
}
if (sum == 1 ) {
ans |= sum << i;
}
if (sum == 2 ) {
ans |= sum/ 2 << i
}
} return ans;
} |
利用位运算,求每位1出现的次数,出现3次的最后加起来%3==0. !=0的要么是1次,要么是2次。分情况讨论就行。最后的| 或运算,很强哦。。。
有道给的是一个数出现了一次,其他数都出现了三次,找出这一个数,对应LeetCode137题!位运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Solution {
public int singleNumber( int [] nums) {
int length = nums.length;
int result = 0 ;
for ( int i = 0 ; i< 32 ; i++){
//int count = 0;
int temp = 0 ;
for ( int j= 0 ; j<length; j++){
temp+=(nums[j]>>i & 1 );
//count++;
}
//if(count %3==1)
result |= (temp% 3 )<<i;
}
return result;
}
} |
当时写的时候出现了一点小小的问题,就是最后 | 的时候,忘记左移回来了。
本文转自 努力的C 51CTO博客,原文链接:http://blog.51cto.com/fulin0532/1957485