【Hot 100 刷题计划】 LeetCode 136. 只出现一次的数字 | C++ 哈希表&异或基础解法

LeetCode 136. 只出现一次的数字

📌 题目描述

题目级别:简单

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

  • 示例 1:

    输入:nums = [2,2,1]

    输出:1

  • 示例 2:

    输入:nums = [4,1,2,1,2]

    输出:4


💡 解法一:哈希表计数法

面对"统计元素出现次数"的问题,人类的第一直觉通常是使用哈希表(Hash Map)或者字典。

我们只需要遍历一次数组,把每个数字作为 Key,出现的次数作为 Value 存起来。最后再遍历一次哈希表,找到那个 Value 为 1 的 Key,就是我们要找的落单数字。

⚠️ 细节提醒:

在 C++ 中,std::map 底层是红黑树,查找和插入的时间复杂度是 O(log⁡N)O(\log N)O(logN);而 std::unordered_map 底层是哈希表,时间复杂度是真正的 O(1)O(1)O(1)。为了严格满足题目的线性时间要求,我们应当使用 unordered_map


💻 C++ 代码实现 (哈希表法)

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        // 使用 unordered_map 保证 O(1) 的插入和查找时间
        unordered_map<int, int> mp;

        // 第一次遍历:统计每个数字出现的频率
        for (int i = 0; i < nums.size(); i ++ )
        {
            mp[nums[i]] ++ ;
        }

        // 第二次遍历:在哈希表中寻找频率为 1 的数字
        for (auto tt : mp)
        {
            if (tt.second == 1) return tt.first;
        }

        return -1; // 理论上不会走到这里
    }
};

💡 解法二:异或运算 (XOR) 的降维打击

题目给出了极其严苛的条件:时间 O(N)O(N)O(N) 且空间 O(1)O(1)O(1)。这意味着我们不能借助任何数组、哈希表等外部数据结构。

这道题是计算机科学中利用**"位运算"的绝对经典。我们需要用到 异或运算 (^)**。

异或运算有三个极其优美的数学性质:

  1. 任何数和 0 做异或运算,结果仍然是原来的数 :a⊕0=aa \oplus 0 = aa⊕0=a
  2. 任何数和其自身做异或运算,结果是 0 :a⊕a=0a \oplus a = 0a⊕a=0
  3. 异或运算满足交换律和结合律 :a⊕b⊕a=(a⊕a)⊕b=0⊕b=ba \oplus b \oplus a = (a \oplus a) \oplus b = 0 \oplus b = ba⊕b⊕a=(a⊕a)⊕b=0⊕b=b

破局点:

题目中明确指出"除了某个元素只出现一次以外,其余每个元素均出现两次 "。

只要我们将数组中的所有元素全部进行异或运算,根据交换律和结合律,那些成对出现的数字就会自动排在一起互相抵消成 0。最终剩下的,就是那个孤零零的、只出现了一次的数字!


💻 C++ 代码实现 (极简异或法)

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        // 初始值为 0,因为 0 异或任何数等于任何数本身
        int res = 0;
        
        // 遍历数组,将所有数字进行异或累加
        for (auto e : nums) {
            res ^= e; 
        }
        
        // 成对的数字全变成 0 抵消了,最后留下来的 res 就是只出现一次的数字
        return res;
    }
};
相关推荐
智者知已应修善业10 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn10 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室10 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星10 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
云泽80811 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
科研前沿11 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨11 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
AI进化营-智能译站12 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
晨曦夜月12 小时前
map与unordered_map区别
算法·哈希算法
Morwit12 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展