剑指 Offer 56 - II 数组中数字出现的次数 II
概述
https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/
有意思哦,出现 3 次的话,要怎么搞嘞。
暴力法
这次用一个哈希表来记录。
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        unordered_map<int, int> m;
        for (auto n : nums) m[n] ++;
        for (auto iter = m.begin(); iter != m.end(); iter ++) {
            if (iter->second == 1) return iter->first;
        }
        return 0;
    }
};
位运算
所有数字的所有位对应相加,其中不能被 3 整除的即目标数字的位。
这是看的剑指 Offer 上的思路。
实现时,注意 if (i != 31) mask = mask << 1; 这里,
如果左移 32 次将导致 runtime error: left shift of negative value -2147483648。
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        vector<int> count(32);
        for (auto n : nums) {
            int mask = 1;
            for (int i = 0; i < 32; i ++) {
                if (n & mask) count[i] ++;
                if (i != 31) mask = mask << 1;
            }
        }
        int ans = 0;
        for (int i = 31; i >= 0; i --) {
            ans = ans << 1;
            ans += count[i] % 3;
        }
        return ans;
    }
};
Links: sword-offer-56-2