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

京公网安备 11010502036488号