剑指offer:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
1)如果把数组中的所有数字都依次异或一遍,则可以消掉成对出现的数字,那么还有两个数字是单一的,肯定也不同,那么最终异或的结果肯定不是0。表示在二进制中肯定有一位是1,那么两个不同的数字,一定有一个在该位为1,另一个在该位为0。如果将整个数组按照该位是否为1分为两部分,那么这两部分各自包含一个单一数字。这里实现这个就需要设置一个flag标志位,通过对其左移动来实现。
flag<<= 1;或者是flag=flag*2;
2)分为两部分的数组,分别异或,最终结果就是这两个数。
3)注意:这个flag就是我们一个额外的条件,按照条件查找,边查找,边异或就行了。
代码实现:
public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int flag=1; int temp=array[0]; for(int i=1;i<array.length;i++){ temp=array[i]^temp; } while((flag&temp)==0) flag<<= 1; for(int i = 0; i < array.length; ++ i ){ if((flag & array[i]) == 0) num2[0]^= array[i]; else num1[0]^= array[i]; } } }