137. 只出现一次的数字 II

发布时间 2023-10-15 22:36:57作者: DawnTraveler

1.题目介绍

2.题解

2.1 哈希表

思路

同本系列题I,不过多赘述

代码

class Solution {
public:
    int singleNumber(std::vector<int>& nums) {
        std::unordered_map<int,int> map;
        for (int num:nums){
            map[num]++;
        }
        for (auto pair:map){
            if (pair.second == 1) return pair.first;
        }
        return 0;
    }
};

结果展示

空间代价不是很理想

2.2 依次确定每一个二进制位

思路

这里的思路要类比上一题中的异或运算(排除所有出现偶次的数,使用了异或运算的性质)
这里重复出现三次,是一个三的倍数,如何利用好这个性质?
1.首先思考整体除三或者对其用3求余,发现了一个问题,用3求余的时候,确实能求出0,1,2,但是这里的数可能是n*3 + (0,1,2),无法确定这个n?
2.我们就在想能不能消除这个n,最好把这个n拆成n次一位一位的运算就好了,那么每一位我都能确定是0,1,2(或者更少的数),之后统一再变回来。

换句话说,如果这里的进制位数小于3,比如像二进制