Java代码实现 一个整型数组里,除了两个数字,只出现一次,其他数字都出现两次,请找出这两个只出现一次的数字,时间复杂度on,空间复杂度o1
时间: 2023-12-22 19:02:20 浏览: 68
找出只出现一次的数字
5星 · 资源好评率100%
这道题可以利用异或运算的性质来解决。首先,将数组中的所有数字进行异或运算,得到的结果就是只出现一次的两个数字的异或结果。因为其他数字都出现了两次,所以异或结果中的每一位,要么是两个只出现一次的数字对应位上的数字不同,要么是相同的数字中的某个数字在这一位上是0,另一个数字在这一位上是1。
然后,我们从异或结果中找到任意一位为1的位,即找到两个只出现一次的数字在这一位上不同的那个位。因为这两个数字在这一位上不同,所以我们可以根据这一位将原数组中的数字分成两组,一组数字在这一位上是1,另一组数字在这一位上是0。那么这两个只出现一次的数字就被分到了不同的组中,其他数字都恰好被分成了一对对的数字,这就回到了“找出一个数字出现一次,其他数字都出现两次”的问题,可以直接用异或的方法求解。
以下是Java代码实现:
public int[] findNumbersAppearOnce(int[] nums) {
if (nums == null || nums.length < 2) {
return null;
}
// 将所有数字进行异或运算,找到两个只出现一次的数字的异或结果
int xor = 0;
for (int num : nums) {
xor ^= num;
}
// 找到两个只出现一次的数字在哪一位上不同
int index = findFirstBitIs1(xor);
// 按照这一位是否是1,将数组中的数字分成两组
int num1 = 0, num2 = 0;
for (int num : nums) {
if (isBit1(num, index)) {
num1 ^= num;
} else {
num2 ^= num;
}
}
return new int[]{num1, num2};
}
// 找到一个数字二进制表示中最右边是1的位
private int findFirstBitIs1(int num) {
int index = 0;
while ((num & 1) == 0 && index < 32) {
num >>>= 1;
index++;
}
return index;
}
// 判断一个数字二进制表示中从右往左数第index位是不是1
private boolean isBit1(int num, int index) {
num >>>= index;
return (num & 1) == 1;
}
阅读全文