当前位置: 首页 > news >正文

136. 只出现一次的数字

简单

提示

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

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

输出:1

示例 2 :

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

输出:4

示例 3 :

输入:nums = [1]

输出:1

提示:

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • 除了某个元素只出现一次以外,其余每个元素均出现两次。

📝 核心笔记:只出现一次的数字 (Single Number - XOR)

1. 核心思想 (一句话总结)

“消消乐魔法:异或运算就像‘对对碰’,两个相同的数字相遇会变成 0(相互抵消),最后剩下的那个就是落单的数字。”

  • 性质 AN ^ N = 0(自己异或自己,归零)。
  • 性质 BN ^ 0 = N(任何数异或 0,保持不变)。
  • 性质 C:满足交换律和结合律 (顺序无所谓,a ^ b ^ c等于a ^ c ^ b)。
  • 结论a ^ b ^ a ^ c ^ b=(a^a) ^ (b^b) ^ c=0 ^ 0 ^ c=c
2. 算法流程 (Iterative XOR)
  1. 初始化 (Init)
    • ans = 0。因为 0 是异或的单位元(就像加法里的 0,乘法里的 1),它不会改变计算结果。
  1. 遍历 (Loop)
    • 遍历数组中的每一个数x
    • 执行ans = ans ^ x
    • 在这个过程中,所有成对出现的数字,无论它们相隔多远,最终都会在异或的数学层面上“相遇”并抵消成 0。
  1. 结果 (Result)
    • 循环结束后,ans里剩下的就是那个唯一的、没有被抵消的数字。
🔍 代码回忆清单
// 题目:LC 136. Single Number class Solution { public int singleNumber(int[] nums) { // 1. 初始化为 0 // 0 ^ x = x,保证第一个数进去后保持原样 int ans = 0; // 2. 遍历所有数字 for (int x : nums) { // 3. 异或累加 (消消乐) // 相同的数字会在过程中互相抵消 ans ^= x; } // 4. 返回幸存者 return ans; } }
⚡ 快速复习 CheckList (易错点)
  • [ ]为什么不需要排序?
    • 因为异或满足交换律[4, 1, 2, 1, 2]的计算顺序虽然是4^1^2^1^2,但数学上等价于4 ^ (1^1) ^ (2^2)
  • [ ]如果用 HashSet 呢?
    • 也可以。Set存第一次遇到的,删第二次遇到的。最后剩在 Set 里的就是结果。
    • 但是 Set 需要 的空间,题目进阶要求 空间,所以必须用异或。
  • [ ]通用性?
    • 这个解法只适用于“其他数字都出现偶数次(2次, 4次...)”的情况。如果其他数字出现 3 次,需要用位统计法 (LC 137)。
🖼️ 数字演练

nums = [4, 1, 2, 1, 2]

  1. 初始:ans = 0
  2. x = 4:ans = 0 ^ 4 = 4。(目前落单的是 4)
  3. x = 1:ans = 4 ^ 1。 (结果是 5,二进制 100^001=101。暂时看不出意义,继续)
  4. x = 2:ans = 4 ^ 1 ^ 2
  5. x = 1(关键):
    • ans = 4 ^ 1 ^ 2 ^ 1
    • 利用交换律调整视角:4 ^ 2 ^ (1 ^ 1)->4 ^ 2 ^ 0
    • 1 被消掉了!
  1. x = 2(关键):
    • ans = 4 ^ 2 ^ 0 ^ 2
    • 调整视角:4 ^ (2 ^ 2) ^ 0->4 ^ 0 ^ 0
    • 2 被消掉了!
  1. 最终结果:4
http://www.jsqmd.com/news/487490/

相关文章:

  • 新手福音,无需安装visualstudio,用快马AI生成第一个Python入门项目
  • 突破地域限制:Locale-Emulator让国际软件流畅运行的实战指南
  • 声纹识别工程化实战:从模型训练到服务调用的全链路解析
  • RIP的毒性逆转与水平分割实战对比(手把手实验指南)
  • Z-Image-Turbo-rinaiqiao-huiyewunv一文详解:max_split_size_mb=128对CUDA内存分配的优化作用
  • Qwen3-ASR-1.7B电话场景应用:客服通话质量检测系统
  • 大型工程采购如何避坑?揭秘TOP3三防布定制厂家的核心底牌
  • Unity3D中R3的实战应用与安装指南
  • Fish-Speech 1.5小白友好教程:无需懂代码,用WebUI轻松玩转语音合成
  • 日报26-004
  • BlurPool实战:用抗混叠滤波修复CNN的平移敏感性【PyTorch代码解析】
  • 嵌入式USB隔离拓展坞:电源域物理隔离设计
  • Python实战:九种近红外光谱预处理方法的场景化应用与代码解析
  • 凸包
  • USB 2.0拓展坞+蓝牙音箱一体化嵌入式设计
  • 体验纯正国风水墨!Guohua Diffusion工具界面详解与操作指南
  • # 发散创新:用Python实现公平算法在推荐系统中的落地实践在当今数据驱动的时代,**
  • 基于GD32F470的嵌入式声学识别系统设计
  • Windows 10/11动态壁纸终极指南:从Lively Wallpaper安装到4K资源下载
  • bge-large-zh-v1.5部署避坑指南:SGLang环境配置与快速验证
  • Janus-Pro-7B对比分析:与传统计算机视觉和NLP pipeline的性能差异
  • 2026年上海食材配送与食堂承包企业实力榜:食堂蔬菜食材配送、食堂食材配送、生鲜食材配送、企业食堂承包、食堂承包公司五家企业凭供应链与服务能力出圈 - 海棠依旧大
  • GM打击乐音色表解析:从经典音源到现代应用
  • [特殊字符] Local Moondream2工业检测:初步探索零部件图像异常识别能力
  • ceph认证和授权
  • wan2.1-vae部署案例:双RTX 4090环境下免配置镜像一键启动实操
  • SolidWorks2021 Toolbox标准件库实战:从零配置到高效拖放的完整指南
  • 开源工具unnpk实战指南:高效解析网易游戏NPK资源包全攻略
  • JQ8900语音模块串口控制与移植实战:基于TI MSPM0开发板的语音播报驱动开发
  • QT与PCL/VTK实战:QVTKOpenGLNativeWidget集成指南与点云可视化案例解析