noaman_wgs

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

【题目】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
* 【思路】异或性质:数异或自己即为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 }

 

posted on 2016-06-22 13:17  noaman_wgs  阅读(148)  评论(0)    收藏  举报