跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

LeetCode 202 快乐数:快慢指针解法详解

快乐数判断通过快慢指针算法解决。将数字变换视为链表节点,检测循环。若最终到达 1 则为快乐数,否则进入不包含 1 的循环。代码使用 C++ 实现,时间复杂度 O(log n),空间复杂度 O(1)。

二进制发布于 2026/3/22更新于 2026/10/792 浏览
LeetCode 202 快乐数:快慢指针解法详解

LeetCode 202 快乐数:快慢指针解法详解

在数学的奇妙花园里,有一种特殊的数字被赋予了"快乐"的称号。快乐数(Happy Number)就像一位在数字迷宫中寻找出口的旅人,它遵循着特定的变换规则,一步步走向最终的归宿——1。

快乐数的定义:对于一个正整数,如果将其各位数字的平方和不断进行替换,最终能够得到 1,那么这个数就被称为快乐数。反之,如果陷入一个不包含 1 的循环,那么这个数就是不快乐的。

让我们以 19 为例,展开这段数字的奇妙旅程:

19 → 1² + 9² = 82
82 → 8² + 2² = 68
68 → 6² + 8² = 100
100 → 1² + 0² + 0² = 1

瞧!经过 4 步变换,19 最终到达了幸福的终点——1,因此它是一个快乐数。

解题思路:从数字到链表的思维转换

链表思维的巧妙应用

虽然表面上我们处理的是数字,但如果我们把每个数字看作链表中的一个节点,把数字变换规则看作指向下一个节点的指针,那么快乐数问题就转化为了链表判环问题!

19 → 82 → 68 → 100 → 1 → null

快慢指针:龟兔赛跑的智慧

在链表判环问题中,快慢指针算法是一种经典且高效的解决方案。我们可以让两个指针以不同的速度遍历这个"数字链表":

  • 慢指针(p):每次计算一次数字变换
  • 快指针(q):每次计算两次数字变换

如果存在环(即数字不快乐),快慢指针终将相遇;如果数字快乐,快指针会率先到达 1。

算法实现:C++代码解析

关键函数:数字变换

// 计算数字 n 的下一个变换结果
int getNext(int n) {
    int sum = 0;
    while (n > 0) {
        int digit = n % 10; // 获取最后一位数字
        sum += digit * digit;
        n /= 10; // 去掉最后一位数字
    }
    return sum;
}

快乐数判断主逻辑

bool isHappy(int n) {
    int slow = n; // 慢指针
    int fast = getNext(n); // 快指针先走一步
    // 当快慢指针不相等且快指针未到达 1 时继续循环
    while (fast != 1 && slow != fast) {
        slow = getNext(slow); // 慢指针走一步
        fast = getNext(getNext(fast)); // 快指针走两步
    }
    return fast == 1; // 判断快指针是否到达 1
}

数学深度:数字会无限增大吗?

一个自然的疑问是:在变换过程中,数字会不会变得越来越大,最终无限增长?让我们通过数学分析来解答这个问题。

对于一个 m 位数 n,其各位数字平方和的最大值为 81m(当所有位都是 9 时)。而:

  • 当 m=3 时,最大和为 243(3×81),远小于 999
  • 当 m=4 时,最大和为 324,远小于 9999

事实上,对于任何大于 3 位的数字,经过一次变换后数字都会变小。因此,数字不会无限增大,最终要么收敛到 1,要么进入一个有限的循环。

快乐数的性质与统计

快乐数有一些有趣的性质:

  1. 所有不快乐数最终都会进入循环:4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4
  2. 1 到 100 之间的快乐数有:
快乐数变换步骤
10
75
101
132
194
……

复杂度分析与优化

时间复杂度:O(log n),因为每次变换都会显著减少数字的大小(对于大数而言)。
空间复杂度:O(1),因为我们只使用了常数个额外空间。

扩展思考

  1. 快乐数的密度:随着数字增大,快乐数的比例会如何变化?
  2. 快乐素数:既是素数又是快乐数的数字,如 7、13、19 等。
  3. 连续快乐数:是否存在连续的快乐数?(例如 31 和 32 都是快乐数)

快乐数问题不仅是一个有趣的编程练习,更是数学之美的一个缩影。它展示了如何将看似简单的数字变换转化为深刻的算法问题,并通过巧妙的思维转换找到高效的解决方案。

目录

  1. LeetCode 202 快乐数:快慢指针解法详解
  2. 解题思路:从数字到链表的思维转换
  3. 链表思维的巧妙应用
  4. 快慢指针:龟兔赛跑的智慧
  5. 算法实现:C++代码解析
  6. 关键函数:数字变换
  7. 快乐数判断主逻辑
  8. 数学深度:数字会无限增大吗?
  9. 快乐数的性质与统计
  10. 复杂度分析与优化
  11. 扩展思考

更多推荐文章

查看全部
  • MySQL 索引原理:B+ 树演进与操作实战
  • YOLO11 基于 DroneVehicle 数据集的无人机车辆目标检测
  • 微搭低代码:手机号登录与RBAC路由控制
  • Mastering GitHub Copilot 课程点评:免费版与 Pro 版差异解析
  • MySQL 互联网公司常用分库分表方案汇总
  • 告别“只会聊天”的AI!OpenClaw小白入门:定位、部署、场景全攻略
  • OpenClaw 多 Agent 对接飞书机器人
  • MySQL 中 COUNT(*) 与 COUNT(1) 的区别及性能对比
  • Python 核心应用实战:数据分析与自动化脚本开发指南
  • Ubuntu 虚拟机部署 OpenClaw 个人 AI 助手指南
  • 机器人系统设计核心:从架构拆解到工程落地实践
  • MySQL 表的内连接与外连接
  • 小红书 AlignRec: 多模态推荐系统的对齐与训练框架
  • Nginx 域名跳转配置实战
  • IntelliJ IDEA 三大 AI 编程插件实测:Copilot、TRAE 与灵码深度对比
  • C++11 核心新特性解析:列表初始化、右值引用与移动语义
  • 剑指 Offer 27:二叉树的镜像递归实现
  • SQL 注入攻击原理、案例与防御方案
  • UML 类图及六大关系详解:继承、实现、依赖、关联、聚合、组合
  • 200 行 Python 构建 AI 量化交易系统

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online