题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路:
可以用位运算实现,如果将所有所有数字相异或,则最后的结果肯定是那两个只出现一次的数字异或的结果,所以根据异或的结果1所在的最低位,把数字分成两半,每一半里都还有只出现一次的数据和成对出现的数据,这样继续对每一半相异或则可以分别求出两个只出现一次的数字
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int sum = 0;
for(int i : array)
sum ^= i;
//找到sum中从最低位开始的第一位是1的位置index
int index = 0;
for(; index < 32; index++)
if((sum & (1<<index)) != 0)
break;
//以index位的不同划分为两部分
for(int i : array){
if((i & (1<<index)) == 0)
num1[0] ^= i;
else
num2[0] ^= i;
}
}
}