import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int singleNumberII (int[] nums) {
// write code here
int ones = 0, twos = 0;
for (int num : nums) {
// 对于出现两次的标识,更新twos,表示已经出现两次
twos |= (ones & num);
// 对于出现一次的标识,更新ones
ones ^= num;
// 对于出现三次的标识,将ones和twos中相应位清零
int commonBits = ones & twos;
//将 ones 中对应出现了三次标识的位清零,因为这些位已经不再是只出现一次的标识了
//~是取反操作
ones &= ~commonBits;
twos &= ~commonBits;
}
return ones;
}
}
Java代码
该题的知识点主要是位运算,& ~运算符
- twos |= (ones & num) 更新 twos 变量,将出现两次的标识的位添加到 twos 中。
- ones ^= num 更新 ones 变量,将出现一次的标识的位添加到 ones 中,同时清除出现三次的标识的位。
- commonBits 存储了同时在 ones 和 twos 中都出现了的标识的位情况。
- ones &= ~commonBits 将 ones 中出现三次标识的位清零,保留只出现一次的标识的位情况。
- twos &= ~commonBits 将 twos 中出现三次标识的位清零,保留出现两次的标识的位情况。
- 返回只出现了一次的牛的标识,即 ones 变量的值。

京公网安备 11010502036488号