【题目】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
* 【思路】异或性质:数异或自己即为0;
* 一个数组中,从头到尾异或的结果为不重复数字异或结果。成对出现数字异或后抵消。
1 package com.exe9.offer; 2 3 /** 4 * 【题目】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 5 * 【思路】异或性质:数异或自己即为0; 6 * 一个数组中,从头到尾异或的结果为不重复数字异或结果。成对出现数字异或后抵消。 7 * @author WGS 8 * 9 */ 10 public class FindNumberAppearOnce1 { 11 12 public void getNumberAppearOnce(int[] arr){ 13 if(arr==null) return ; 14 int start=0; 15 //1 先从头至尾依次异或,得到最后的结果。0010(不重复数字异或的结果) 16 for(int i=0;i<arr.length;i++){ 17 start^=arr[i]; 18 } 19 //2 由上述得到的结果找到右边第一个1出现的位置; 20 //int indexOfFirst=findFirstIndexis1(start); 21 int indexOfOne=0; 22 while(((start&1)!=1) && (indexOfOne<32)){//位数限制 23 start=start>>1; 24 indexOfOne++;//得到位置 25 } 26 int num1=0,num2=0; 27 //3 根据倒数第index位置是否为1将数组arr分成两类,并依次异或,异或的结果即为每个数组中只出现一次的数。 28 for(int j=0;j<arr.length;j++){ 29 if(isNumOne(arr[j],indexOfOne)){ 30 num1^=arr[j]; 31 }else{ 32 num2^=arr[j]; 33 } 34 } 35 System.out.println("只出现一次 的数是:"+num1+","+num2); 36 } 37 /*private int findFirstIndexis1(int start) { 38 int indexOfOne=0; 39 while(((start&1)!=1) && (indexOfOne<32)){//位数限制 40 start=start>>1; 41 indexOfOne++;//得到位置 42 } 43 return indexOfOne; 44 }*/ 45 //判断倒数第indexOfOne位置上是否为1 46 public boolean isNumOne(int num,int indexOfOne){ 47 num=num>>indexOfOne; 48 return ((num&1)==1)?true:false; 49 50 } 51 52 53 54 public static void main(String[] args){ 55 int[] arr=new int[]{2,4,3,6,3,2,5,5}; 56 new FindNumberAppearOnce1().getNumberAppearOnce(arr); 57 } 58 }

浙公网安备 33010602011771号