news 2026/6/13 2:12:45

LeetCode 137「Single Number II」详解:位计数 + 模3运算 + 状态机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 137「Single Number II」详解:位计数 + 模3运算 + 状态机

给定题目是 LeetCode 137「Single Number II」:在一个整数数组中,除了一个元素只出现一次以外,其余每个元素都恰好出现三次,要求在 O(n) 时间、O(1) 额外空间内找出这个只出现一次的元素。cnblogs+1​

题意与难点

题目核心约束:

  • 所有「杂音」元素都出现 3 次。
  • 只有目标元素出现 1 次。
  • 不能用哈希表计数(不满足常数空间),也不能排序(不满足线性时间)。leetcode+1​

难点在于:如何利用「出现三次」这个信息,把所有重复元素的贡献抵消掉,只保留那个只出现一次的数的 位信息。cnblogs​

基础思路:按位计数 + mod 3

可以把每个数当成 32 位二进制整数,从「每一位」的角度来看问题。dbwu+1​

对于第 i 位(0 ≤ i < 32):

  • 统计数组里有多少个数在这一位是 1,记为 count[i]。
  • 所有出现 3 次的数,如果这一位是 1,就为这一位贡献 3 的倍数个 1。
  • 只有那个出现 1 次的数,如果这一位是 1,会多贡献一个 1,使总数变成 3k+1。dbwu+1​

因此:

  • 对每一位的计数做 count[i] % 3,结果只可能是 0 或 1。
  • 结果为 1 的位,说明这一位属于只出现一次的那个数;结果为 0 的位,说明这一位全被「3 次」的元素抵消干净了。linkedin+1​

最终,把所有 count[i] % 3 == 1 的位组合起来,就构成答案的二进制表示,从而恢复出这个唯一元素。linkedin+1​

这个思路的逻辑完全正确:时间复杂度是 O(32×n) 也就是 O(n),空间只需要 32 个计数器(常数级),符合题目要求。algo+1​

进一步优化:有限状态机(ones / twos)

在按位计数的基础上,可以继续压缩空间,把「每一位出现次数 mod 3」压缩成一个小型有限状态机,用两个整数的比特来并行维护所有位的状态,即常见的 ones / twos 写法。liadbiz.github+1​

对于某一位来说,出现次数 mod 3 的状态只有三种:0 次、1 次、2 次。

用两位二进制来编码这三种状态,例如:

  • 00:出现 0 次。
  • 01:出现 1 次。
  • 10:出现 2 次。
  • 出现第 3 次时状态回到 00,相当于做了一次模 3 运算。liadbiz.github+1​

ones 和 twos 两个整数的每一位就分别代表该位计数的低位和高位,整套逻辑就是在所有位上并行进行一个「模 3 加法器」。csdn+1​

最终,出现次数为 1 的那个数的各个位,会停留在状态 01,也就是保存在 ones 里,所以 ones 就是最后答案。csdn+1​

这个有限状态机写法本质上是对「按位计数 + mod 3」的进一步压缩与抽象,但核心思想完全一样:利用模 3,把所有出现三次的数字抹掉,只留下出现一次的那个数的位模式。cnblogs+1​

负数处理要点

由于题目允许负数,通常使用 32 位有符号整数:

  • 在按位计数的方案中,只要一视同仁地处理 32 位(包含最高的符号位),最终重建出来的二进制如果最高位是 1,就对应一个负数,这样也能正确还原结果。vultr+1​
  • 有些讲解会特别说明第 31 位(符号位)需要单独按补码规则处理,但只要语言本身用补码表示,按位统计 + 重建即可自然兼容。algo+1​

小结

  • 思想起点:从「数」切换到「位」,对于每一位统计 1 的出现次数。
  • 关键观察:出现 3 次的数在每一位上的贡献必然是 3 的倍数,只有目标数让某些位变成 3k+1。
  • 实现路径
    • 入门版:32 个计数器 + 双层循环 + mod 3 重构答案。
    • 进阶版:用 ones / twos 状态机把每一位的计数 mod 3 压缩到两个整型中。

整道题本质就是一题典型的「按位计数 + 模运算 + 位运算有限状态机」练习,非常适合作为位运算思维的入门模板。dbwu+1​

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 23:45:51

Eclipse写JS没提示?旧插件是元凶,这样设置秒恢复

在Eclipse中进行JavaScript开发时&#xff0c;代码提示&#xff08;Content Assist&#xff09;功能缺失是许多开发者遇到的典型问题。这并非Eclipse本身不强大&#xff0c;而是由于其设计重心长期在Java生态&#xff0c;对动态语言的支持需要额外配置。缺乏智能提示会显著降低…

作者头像 李华
网站建设 2026/6/10 13:29:34

邮件订阅列表开通:定期发送VibeThinker更新简报

邮件订阅列表开通&#xff1a;定期发送VibeThinker更新简报 在如今动辄数百亿参数的“大模型军备竞赛”中&#xff0c;一个仅15亿参数的小模型突然闯入视野&#xff0c;并在数学推理与算法编程任务上频频击败比它大几十倍甚至上百倍的对手——这听起来像科幻情节&#xff0c;但…

作者头像 李华
网站建设 2026/6/5 12:04:49

UVa 115 Climbing Trees

题目分析 本题要求根据输入的父子关系对&#xff08;child-parent pairs\texttt{child-parent pairs}child-parent pairs&#xff09;构建一个家族树&#xff0c;然后对一系列查询对&#xff08;query pairs\texttt{query pairs}query pairs&#xff09;判断两人之间的亲属关系…

作者头像 李华
网站建设 2026/6/5 13:08:50

Chain-of-Thought提示法适配:引导VibeThinker分步推理技巧

Chain-of-Thought提示法适配&#xff1a;引导VibeThinker分步推理技巧 在AI大模型参数规模不断膨胀的今天&#xff0c;一个反向趋势正在悄然兴起——我们是否真的需要千亿参数才能解决复杂的逻辑问题&#xff1f;微博开源的 VibeThinker-1.5B-APP 给出了令人意外的答案&#xf…

作者头像 李华
网站建设 2026/5/30 23:21:37

容器环境突现未知进程,如何用Falco秒级发现并响应?

第一章&#xff1a;容器环境突现未知进程&#xff0c;如何用Falco秒级发现并响应&#xff1f; 在现代云原生架构中&#xff0c;容器运行时突发未知进程是常见的安全威胁之一。攻击者可能通过镜像漏洞或配置错误植入恶意进程&#xff0c;进而横向移动或窃取数据。Falco 作为一款…

作者头像 李华
网站建设 2026/6/12 14:08:15

基于RCGELAN-YOLOv11的路面损伤检测算法

导读&#xff1a; 本文针对路面损伤检测任务中传统方法效率低、易受环境干扰的痛点&#xff0c;提出了一种基于RCGELAN-YOLOv11的改进算法。在YOLOv11算法的基础上改进网络结构&#xff0c;通过设计RC-G-ELAN模块替代YOLOv11中的C3k2模块&#xff0c;实现了检测精度与计算效率…

作者头像 李华