剑指offer-第六章面试中的各项能力(数组中只出现一次的数字)
题目:输入一个数组,该数组中有两个只出现一次的数字,其他的数字都出现两次,输出出只出现一次的数字。
思路:首先,我们可以将这个数组分成两份,一份里面放一个只出现一次的数字。那么我们该怎么分呢?将整个数组中的数字都异或,那么那些等的数字异或后都化为0,因此最后出现的不为0的数字就是两个只出现一次的数字他们两个异或的结果。我们找到该结果中的最右边的一个1,然后根据这个1将数组划分为两份。
Java代码:
//数组中只出现一次的数。 //题目:数组中其他的数都是出现两次,有两个数只出现一次。 public class OnlyTimeApprance { public void findOneTimeAppranceOfArr(int[] a){ int resultExclusiveOr1=0; int resultExclusiveOr2=0; if(a==null||a.length<2) return; int resultExclusiveOr=0;//用来表示整个数组异或后的结果 for(int i=0;i<a.length;i++){ resultExclusiveOr^=a[i]; } int indexOf1=firstRightOne(resultExclusiveOr); for(int i=0;i<a.length;i++){ if(isBit1(a[i],indexOf1)) resultExclusiveOr1^=a[i]; else resultExclusiveOr2^=a[i]; } System.out.println(resultExclusiveOr1+" "+resultExclusiveOr2); } public boolean isBit1(int i, int indexOf1) { i=i>>indexOf1; if((i&1)==0) return false; return true ; } public int firstRightOne(int resultExclusiveOr) { int indexBit1=0; while((resultExclusiveOr&1)==0){ resultExclusiveOr=resultExclusiveOr>>1; indexBit1++; } return indexBit1; } public static void main(String[] args){ int[] a={2,3,3,4,4,5,5,6}; OnlyTimeApprance ota=new OnlyTimeApprance(); ota.findOneTimeAppranceOfArr(a); } }