题解 | #农场牛的标识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代码

该题的知识点主要是位运算,& ~运算符

  1. twos |= (ones & num) 更新 twos 变量,将出现两次的标识的位添加到 twos 中。
  2. ones ^= num 更新 ones 变量,将出现一次的标识的位添加到 ones 中,同时清除出现三次的标识的位。
  3. commonBits 存储了同时在 ones 和 twos 中都出现了的标识的位情况。
  4. ones &= ~commonBits 将 ones 中出现三次标识的位清零,保留只出现一次的标识的位情况。
  5. twos &= ~commonBits 将 twos 中出现三次标识的位清零,保留出现两次的标识的位情况。
  6. 返回只出现了一次的牛的标识,即 ones 变量的值。
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务