题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:位运算,第一次把所有数求异或得到 两个所求数字 的异或结果。此结果一定不为0,即所求两个数在某位一定一个为0,一个为1。根据此位是否是1将数组划分成两部分,分别对每部分求异或,划分后两部分各自只有一个数出现一次,所以用异或可以分别得出两部分的两个数。
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int x1=0,x2=0; //x1是两个要找的数异或结果 for(int cur:array) x1^=cur; //temp是两个数最低不同那位为1,其余都是0 int temp=x1&(~x1+1); for(int cur:array){ if((cur&temp)!=0){ x2^=cur; } } num1[0]=x2; num2[0]=x1^x2; }