题解 | #数组中只出现一次的数字#
数组中只出现一次的数字
http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811
解题思路大概:1、首先这个题目是说其他重复出现的数字出现次数是两次,这时候我们就可以考虑异或运算的性质,一次遍历整个数组的异或运算能够得到两个只出现一次的数字异或结果,其他出现两次的在异或中都变成了0,0异或其他数字都为其他数字。2、考虑这两个只出现一次的数字异或后的结果一定有某一位为1,我们找到这个1的位数。3、根据这个位数,把原数组分为两次,这两组数组中只会含有一个只出现一次的数字,然后存储。
//将num1[0],num2[0]设置为返回结果
public class Solution {
public static void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
//得到两个只出现一次的数异或后的结果
int res=0;
for(int i:array){
res=res^i;
}
//记录哪个位置出现1
int temp=0;
for(temp=0;temp<32;temp++){
//计算哪一位需要用到算数右移>>,算出来的结果类似于res/2^temp;
if(((res>>temp)&1)==1){
break;
}
}
//把数组分成两半
for(int i:array){
if(((i>>temp)&1)==1){
num1[0]=i^num1[0];
}else {
num2[0]=i^num2[0];
}
}
}
}