剑指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 };