剑指 Offer 56 II. 数组中数字出现的次数 (位运算综合)

2021年02月06日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】



1. 题目简介

剑指 Offer 56 - II. 数组中数字出现的次数 II
在这里插入图片描述

2. 题解

如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。

我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则就是1。

class Solution {
    
    
public:
    int singleNumber(vector<int>& nums) {
    
    
        vector<int> counts(32,0);
        // 记录所有数字各二进制位的 1 出现次数之和
        for(int num : nums) {
    
    
            for(int j = 0; j < 32; j++) {
    
    
                counts[j] += num & 1;
                num >>= 1;
            }
        }
        int res = 0, m = 3;
        // 利用 左移操作 和 或运算 ,将 counts 数组中各二进位的值恢复到数字 res 上
        for(int i = 0; i < 32; i++) {
    
    
            res <<= 1;
            res |= counts[31 - i] % m;
        }
        return res;
    }
};

参考文献

《剑指offer 第二版》

https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/

猜你喜欢

转载自blog.csdn.net/m0_37433111/article/details/113731125
今日推荐