剑指offer——数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
在位运算中的异或 ^ 可以将两个相等的数组消去,而在这一题目中,有两个不相等的数字,所以他们之间至少有一位不同,
含有1(如5和2 1001 0010)异或之后的结果是1011,在数组中,按照1的位置这一结果的不同,
将这些数分为两份,一份是第一位为1的,另外一份是为0的,
其中那两个不一样的数字会因为这个而分开,进而可以用异或来求出
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int len = array.length; int num = array[0]; for(int i = 1; i < len; i++){ num ^= array[i]; } int flag = 1; while(num != 0){ if((num & flag) == 0) flag = flag << 1; else break; } num1[0] = num2[0] = num; for(int i = 0; i < len; i++){ if((array[i] & flag) == 0){ num1[0] ^= array[i]; } else{ num2[0] ^= array[i]; } } } }