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

Posted rookiez

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指56-2 数组中数字出现的次数相关的知识,希望对你有一定的参考价值。

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

 

这道题和上一题很相似,但是因为出现三次,没法使用异或,但是仍然可以使用位运算。

出现三次的数,他们每一位单独加起来肯定可以被三整除,那么我们只要把所有数的位都加起来,不能被三整除的位合起来就是出现了一次的数。

注意加的时候如果改为为1那么应该+1,不能直接写成加上与的结果,会导致数很大,超出longlong也是有可能的。

 1 class Solution {
 2 public:
 3     int singleNumber(vector<int>& nums) {
 4         if(!nums.size())
 5             return 0;
 6         int pos[32]={};
 7         int bitmask=1;
 8         for(int i=0;i<31;i++){
 9             for(auto it=nums.begin();it!=nums.end();it++)
10                 pos[i]+=((*it)&bitmask)?1:0;
11             bitmask=bitmask<<1;
12         }
13         int bit=1,ret=0;
14         for(int i=0;i<31;i++){
15             if(pos[i]%3!=0){
16                 ret+=bit;
17             }
18             bit=bit<<1;
19         }
20         return ret;
21     }
22 };

 

以上是关于剑指56-2 数组中数字出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer(39) 数组中出现次数超过一半的数字

剑指 Offer 39. 数组中出现次数超过一半的数字 的 详细题解

剑指Offer——数字在排序数组中出现的次数

剑指offer(二十七)之数字在排序数组中出现的次数

剑指Offer-数字在排序数组中出现的次数

剑指offer数字在排序数组中出现的次数