import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型一维数组
     */
    public int[] findSingleCowsII(int[] nums) {
        int res = 0;  // 用于存储所有数异或的结果
        int a = 0;  // 用于存储其中一个只出现一次的数
        int b = 0;  // 用于存储另一个只出现一次的数
        for (int i = 0; i < nums.length; i++) {
            res ^= nums[i];  // 对数组中的数进行异或运算
        }
        // 找到res的二进制表示中最低位的1,表示两个数在这一位一个为0,一个为1
        int index = findFirst1Bit(res);
        for (int num : nums) {
            // 将数组中的每个数按照index位上的值分为两个数组,分别进行异或运算
            // num >> index 先右移到最低位的位置,然后按位与和1进行判断,分成两组,一个是1,一个是0,也就是a和b两个数
            if ((num >> index & 1) == 0) {
                a ^= num;
            } else {
                b ^= num;
            }
        }
        if (a < b) {
            return new int[] {a, b};
        } else {
            return new int[] {b, a};
        }
    }

    // 找到一个整数的二进制表示中最低位的1
    public int findFirst1Bit(int num) {
        int index = 0;
        while ((num & 1) == 0) {
            num >>= 1;
            ++index;
        }
        return index;
    }
}

本题知识点分析:

1.位运算符

2.数组遍历

3.数学模拟

本题解题思路分析:

1.先通过异或,得到结果res

2.寻找res的最低位的1,得到要右移的index

3.根据每个数最低位是1还是0,分别分组进行异或

4.最后判断a和b哪个是较大值,作为第二个数进行返回

本题使用编程语言: Java

如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~