题解 | #只出现一次的牛II#

只出现一次的牛II

https://www.nowcoder.com/practice/fde24d7d8f97467e91403d255243ee1c

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] findSingleCowsII (int[] nums) {
        // write code here
        int res = 0;
        int a = 0;
        int b = 0;
        for(int i = 0;i < nums.length;i++) {
           res ^= nums[i];
        }
        //res就为答案两个数的异或,按res的低位1出现,分为两个数组,两个数这一位一定一个是1一个是0
        int index = findFirst1Bit(res);
        for(int num : nums) {
            if((num >> index & 1) == 0) {
                a ^= num;
            } else {
                b ^= num;
            }
        }
        if(a < b){
            return new int[]{a,b};
        } else {
            return new int[]{b,a};
        }
    }

    public int findFirst1Bit(int num) {
        int index = 0;
        while((num & 1) == 0) {
            num >>= 1;
            ++index;
        }
        return index;
    }
}

思路:

使用用位运算,根据性质,和0异或运算得本身,和本身异或运算为0,对数组所有元素依此异或运算所得结果为两个只出现一次得数的异或,记所得为res。

res中一定有个低位1,反应这两个数在这一位的差别,根据这一位,可以把整个数组分为两部分,每个部分都分别异或,则可得到两个只出现过一次的数。

步骤:

  • 数组元素依次异或,得到res
  • 得到res低位1的移位量index
  • 根据index将数组分为两部分分别异或,得到结果。

全部评论

相关推荐

03-30 19:30
石家庄学院 Java
野蛮的柯基在游泳:都能入股了,还得是Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务