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
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~