剑指56-1 数组中数字出现的次数

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

 

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

 

这个题可以先考虑,如果数组中只有一个数字出现了一次,其他都两次,怎么找到这个数?

运用位运算,把所有数异或起来,因为重复出现的数都会抵消掉,最后剩下的就会是出现一次的数。

如果有两个数出现了一次,那么全部异或起来后,还是会有位为1,我们找到第一个为1的位(其实任何一位都可以,但是第一个花时间最少),这个位肯定是2个数不相同的一个位。

再遍历数组,根据这一位是否为1把数组分为两个子数组。重复的数肯定分到了一遍,两个单独的数肯定也是分到了两个数组中,这样在两个数组中分别寻找就可以了。

 1 class Solution {
 2 public:
 3     vector<int> singleNumbers(vector<int>& nums) {
 4         int len=nums.size();
 5         if(!len) 
 6             return {};
 7         int result=0;
 8         for(auto it=nums.begin();it!=nums.end();it++){
 9             result^=*it;
10         }
11         int pos=1;
12         while(result){
13             if(result&1)
14                 break;
15             pos=pos<<1;
16             result=result>>1;
17         }
18         int num1=0,num2=0;
19         for(auto it=nums.begin();it!=nums.end();it++){
20             if((*it)&pos)
21                 num1^=*it;
22             else
23                 num2^=*it;
24         }
25         return {num1,num2};
26     }
27 };

 

posted @ 2020-07-06 23:31  __rookie  阅读(111)  评论(0编辑  收藏  举报