本题为剑指offer面试题40
牛客网测试地址:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811
- 时间限制:1秒空间限制:32768K
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
package go.jacob.day514;
/*
* 本题为:剑指offer面试题40
*
* num1,num2分别为长度为1的数组。传出参数
* 将num1[0],num2[0]设置为返回结果
*/
public class Demo1 {
public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
// 鲁棒性
if (array == null || array.length < 2)
return;
int resultExclusiveOR = 0;
// 对数组所有数进行异或
for (int i = 0; i < array.length; i++)
resultExclusiveOR ^= array[i];
int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
for (int i = 0; i < array.length; i++) {
if (isBit1(array[i], indexOf1))
num1[0] ^= array[i];
else
num2[0] ^= array[i];
}
}
/*
* 在num的二进制表示中找到第一个位1的位的位置
*/
private int FindFirstBitIs1(int num) {
int indexBit = 0;
// int占4字节,一共32位
while ((num & 1) == 0 && indexBit < 8 * 4) {
num = num >> 1;
indexBit++;
}
return indexBit;
}
// 判断num的indexOf1位上是否为1
private boolean isBit1(int num, int indexOf1) {
if (((num >> indexOf1) & 1) == 1)
return true;
return false;
}
}