2022-7-10 剑指offer-位操作

剑指 Offer 56 - I. 数组中数字出现的次数

难度中等

一个整型数组 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 }

思路:只有一个数字可以直接用异或,两个数字先异或得到一个结果 根据最高位不同的结果来进行分组,两组异或的结果分别是两个出现一次的数字。

 

posted on 2022-07-10 15:31  阿ming  阅读(13)  评论(0编辑  收藏  举报

导航