落单的数 II
给出3*n + 1 个非负整数,除其中一个数字之外其他每个数字均出现三次,
找到这个数字。(挑战:一次遍历,常数级的额外空间复杂度)
样例
样例1
输入: [1,1,2,3,3,3,2,2,4,1]
输出: 4
样例2
输入: [2,1,2,2]
输出: 1
Java代码及思想
本题其实和2n+1个数的情况是差不多的,只不过那时是逢2进位,
现在是要逢3进位,我们可以采用两个变量one two分别代表低位和
高位,当出现一次时one为1,two为0,两次时two 为 1,one
为0,3次则全部置0,我这么说可能比较抽象,具体可以看下面代码:
public class Solution {
/**
* @param A: An integer array
* @return: An integer
*/
public int singleNumberII(int[] A) {
// write your code here
int one = 0, two = 0;
int len = A.length;
for (int i = 0; i < len; i++) {
two = two |(one&A[i]); //当低位one等于A[i]时,高位two置1
one ^= A[i]; //低位置0
int three = two&one; //代表进位
two ^= three; //当one two都为1时置0
one ^= three;
}
return one|two;
}
}
419

被折叠的 条评论
为什么被折叠?



