一、题目
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
二、分析及代码
1. 二进制拆分 + 异或
(1)思路
结合每个数字和自身的异或为 0 的特点,如果一个整型数组中只有一个数字出现了一次,其他的数字都出现了两次,只需将所有数字异或相加即可得到。
本题可在此基础上转化为,如何将数组分为各包含一个只出现一次的数字的两部分。
一种方案是,将数组中所有数字异或后,结果相当于两个只出现一次的数字的异或。因此,其中为 1 的二进制位,对于两个只出现一次的数字,在这一位上必然一个为 0,一个为 1。可根据这一特点,将整个数组进行拆分,再结合异或方法求解。
(2)代码
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array, int num1[], int num2[]) {
if (array == null || array.length < 2)
return;
int sum = 0;
for (int i = 0; i < array.length; i++)
sum ^= array[i];
int index = 0;
while ((sum & 1) == 0) {
sum >>= 1;
index++;
}
int n1 = 0, n2 = 0;
for (int i = 0; i < array.length; i++) {
if (((array[i] >> index) & 1) == 0)
n1 ^= array[i];
else
n2 ^= array[i];
}
num1[0] = n1;
num2[0] = n2;
return;
}
}
(3)结果
运行时间:19ms,占用内存:9680k。
三、其他
暂无。