题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个只出现一次的数字,要求时间复杂O(n),空间复杂度O(1)
思路关键点:两个相同的数异或得0,0与任何数异或得其本身。
public class FindNums {
int num1=0;
int num2=0;
public void findNumsAppearOnce(int data[],int length){
if(data==null||length<2){
System.out.println("输入数据错误!程序将终止");
return;
}
int result=0;
for(int i=0;i<length;i++)
result^=data[i];
int indexOf1=findFirstBitIs1(result);
for(int i=0;i<length;i++){
if(isBit1((data[i]),indexOf1)){
num1^=data[i];
}
else
num2^=data[i];
}
}
public int findFirstBitIs1(int data){
int indexBit=0;
while(((data&1)==0)&&(indexBit<8*4)){
data=data>>1;
++indexBit;
}
return indexBit;
}
public boolean isBit1(int data,int index){
for(int i=0;i<index;i++)
data=data>>1;
if((data&1)==0)
return false;//index处是0返回false
else
return true;//index处是1返回true
}
public static void main(String[] args) {
int[] data={1,2,3,4,6,1,2,3,4,5};
FindNums fn=new FindNums();
fn.findNumsAppearOnce(data, data.length);
System.out.println("num1="+fn.num1+" "+"num2="+fn.num2);
}
}