题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:第一遍异或得到的结果就是两个只出现一次数字的异或结果。因为其余数字出现了两次,完全抵消了。接下来看该结果的最右边为1的是哪位,然后根据此位是否为1,将原数组分成两个数组,分别对两个数组依次异或即可得到最终的结果。
代码:
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { if(array == null || array.length == 0){ return; } int TempResult = 0; for(int i=0;i<array.length;i++){ TempResult ^= array[i]; } int res = FindFirstBit1(TempResult); for(int j=0;j<array.length;j++){ if(IsBit1(array[j],res)){ num1[0] ^=array[j]; } else{ num2[0] ^=array[j]; } } } public static int FindFirstBit1(int num) { return num & (-num); } public boolean IsBit1(int data,int res){ return ((res & data)==0)?false:true; } }