您的位置:首页 > 其它

***[Lintcode]Single Number II 落单的数 II

2016-11-13 17:30 375 查看
Given 
3*n
+ 1
 numbers, every numbers occurs triple times except one, find it.

Example

Given 
[1,1,2,3,3,3,2,2,4,1]
 return 
4


分析:int型需要32位表示。因此对于每一位,计算数组中所有数组在该位的和mod3. 但是不满足one-pass要求

public class Solution {
/**
* @param A : An integer array
* @return : An integer
*/
public int singleNumberII(int[] A) {
int res = 0;
for(int i = 0; i < 32; i++) {
int count = 0;
for(int j = 0; j < A.length; j++) {
if((A[j] & (1 << i)) != 0) count ++;
}
if(count % 3 != 0)
res |= (1 << i);
}

return res;
}
}

网上看了一下其他方法,确实有one-pass的方法。
public class Solution {
/**
* @param A : An integer array
* @return : An integer
*/
public int singleNumberII(int[] A) {
int one = 0, two = 0, three = 0;
for(int i = 0; i < A.length; i++) {
two |= one & A[i];//one出现1次并且A[i]出现1次 则代表可以进位到two
one ^= A[i];//one和A[i]做异或 保证one中只保存出现一次的值
three = one & two;
one &= ~three;//如果three中某一位为1,那么one和two中该为清零
two &= ~three;
}

return one;//返回one,其中已经除去了出现三次的数
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lintcode