题解 | #农场牛的标识II# java
农场牛的标识II
https://www.nowcoder.com/practice/a69dc54eeffa43218d06f62cc733c6c0
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 变量的值。