2022-7-10 剑指offer-位操作
一个整型数组 nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
1 class Solution { 2 public int[] singleNumbers(int[] nums) { 3 int plus=0; 4 for (int x:nums){ 5 plus^=x; 6 } 7 // a+b 8 int a=(Integer.MAX_VALUE-1)/2+1,temp=plus,pos=30; 9 while ((a^temp)>>pos!=0) { 10 pos--; 11 a/=2; 12 } 13 //System.out.println(a+" "+pos); 14 int pos1=0,pos2=0; 15 for (int x:nums){ 16 int t=x^a; 17 if ((t>>pos)%2==0) pos1^=x; 18 else pos2^=x; 19 } 20 return new int[]{pos1,pos2}; 21 } 22 }
思路:只有一个数字可以直接用异或,两个数字先异或得到一个结果 根据最高位不同的结果来进行分组,两组异或的结果分别是两个出现一次的数字。