Leetcode 202题 快乐数:数字世界中的奇妙旅程

Leetcode 202题 快乐数:数字世界中的奇妙旅程

Leetcode 202题 快乐数:数字世界中的奇妙旅程

视频地址

因为想更好的为大佬服务,制作了同步视频,这是Bilibili的视频地址

在数学的奇妙花园里,有一种特殊的数字被赋予了"快乐"的称号。快乐数(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

图1:快乐数的链表表示法。快乐数最终会指向1,然后结束;不快乐的数则会进入一个循环

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

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

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

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

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

关键函数:数字变换

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

快乐数判断主逻辑

boolisHappy(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

表1:部分快乐数及其到达1所需的步骤数

复杂度分析与优化

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

扩展思考

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

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

Leetcode 202题 快乐数:数字世界中的奇妙旅程

Read more

RAG系列:2025年最强开源RAG横评

RAG(Retrieval-Augmented Generation,检索增强生成)技术的出现,彻底改变了我们与AI交互的方式。简单来说,就是让AI不仅能"思考",还能"查资料"。想象一下,一个既有ChatGPT的推理能力,又能随时查阅你的专业资料库的AI助手,这不就是我们梦寐以求的"AI大脑外挂"吗? 本文真正从实战角度去深度评测这些平台。用30天时间,5个平台,真刀真枪地测一遍。 📊 评测维度:怎么"折腾"这些平台的 在正式开始之前,先说说我的评测方法。很多技术评测只看功能列表,我觉得这样不够实际。真正的好产品,应该经得起实战考验。 核心评测维度 1. 部署难度(20分) * 环境要求复杂度 * 安装步骤繁琐程度 * 首次运行成功率 * 文档完整度 2. 功能完整度(25分)

By Ne0inhk
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)

【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)

本篇文章分享关于如何使用STM32单片机对彩色摄像头(OV7725/OV2604)采集的图像数据进行分析处理,最后实现颜色的识别和检测。 目录 一、什么是颜色识别 1、图像采集识别的一些基本概念 1. 像素(Pixel) 2. 分辨率(Resolution) 3. 帧率(Frame Rate) 4. 颜色深度(Color Depth) 5. 图像处理(Image Processing) 6. 图像采集设备 7. 亮度(Luminance)与色度(Chrominance) 8. 图像编码与压缩(Image Encoding and Compression) 9. 图像识别(Image Recognition) 10. 图像采集与处理中的延迟(Latency) 二、OV7725简介

By Ne0inhk
【Code Review】基于GLM4.7的 Claude code 官方github代码自动审查

【Code Review】基于GLM4.7的 Claude code 官方github代码自动审查

前言 代码审查是软件开发过程中至关重要的一环,它不仅是发现潜在缺陷的利器,更是知识共享、代码质量提升和团队协作的催化剂。然而,我们在日常工作中,小团队作坊往往没有时间相互进入code review工作,为了能够不影响工作进展的同时,做好代码的review,我们今天基于claude code来进行github仓库代码的自动review。 代码审查:为何不可或缺? 1. 提升代码质量:审查者可以发现逻辑错误、边界条件处理不当、潜在的性能瓶颈以及不符合编码规范的写法。 2. 知识传播与学习:资深开发者可以通过审查指导新人,新人也能在审查中学习到新的技术和设计模式。 3. 统一代码风格:确保团队遵循一致的编码规范,提高代码的可读性和可维护性。 4. 预防缺陷前移:在代码合并到主分支前发现问题,远比上线后修复代价小得多。 5. 增强代码所有权:团队成员共同对代码负责,而非仅由原作者负责。 废话不多说,我们直接开始教程(本教程基于Linux amd64进行)。 一、安装 GitHub CLI (gh) 我们在进行之前,需要先安装 GitHub CLI (gh)

By Ne0inhk
2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操) 如果你最近登录 GitHub 时被提示“启用双因素身份验证(2FA)”,别慌——这就是在你输入密码后,再增加一道“动态验证码”的安全锁。本文用TOTP.app(可下载/可在线) 带你从 0 到 1 完成 GitHub 的 2FA 配置,全程保留原图与链接,按步骤照做就能成功。 关键词:GitHub 2FA、GitHub 双因素身份验证、GitHub 启用 2FA、GitHub TOTP、GitHub 动态验证码、GitHub 账号安全、GitHub 登录保护、

By Ne0inhk