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

Flutter 三方库 matcher 的鸿蒙化适配指南 - 实现具备语义化断言与自定义匹配算法的测试契约框架、支持端侧质量验证的强力抽象实战

Flutter 三方库 matcher 的鸿蒙化适配指南 - 实现具备语义化断言与自定义匹配算法的测试契约框架、支持端侧质量验证的强力抽象实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 matcher 的鸿蒙化适配指南 - 实现具备语义化断言与自定义匹配算法的测试契约框架、支持端侧质量验证的强力抽象实战 前言 在进行 Flutter for OpenHarmony 开发时,当编写单元测试时,我们经常使用 expect(actual, matcher) 这种语法。你是否想过,如何让断言读起来像自然语言一样?或者,如何自定义一套专门针对鸿蒙原生组件状态的对比逻辑?matcher 是 Dart 官方维护的断言库扩展,它定义了测试中所有“匹配逻辑”的底层协议。本文将探讨如何在鸿蒙端构建极致、严谨的质量契约体系。 一、原直观解析 / 概念介绍 1.1 基础原理 该库建立在“谓词逻辑(Predicate Logic)”之上。它通过将复杂的 Object

By Ne0inhk
Python+Django的多彩吉安红色旅游网站的设计与实现(Pycharm Flask Django Vue mysql)

Python+Django的多彩吉安红色旅游网站的设计与实现(Pycharm Flask Django Vue mysql)

收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 项目介绍 Python+Django的多彩吉安红色旅游网站的设计与实现(Pycharm Flask Django Vue mysql) 项目展示 详细视频演示 请联系我获取更详细的演示视频 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 技术栈 项目编号: 本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行,将系统所使用到的表以及数据存储到MySQL数据库中,方便对数据进行操作本课题基于WEB的开发平台 开发语言:Python 框架:flask/django的都有 Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 浏览器:谷歌浏览器 本系统的开发与设计是基于vue为前端页面核心框架为django/flask,技术方面主要采用了Html、Js、CSS3、p

By Ne0inhk
DormOne|基于 Flutter × HarmonyOS 6.0 的新生宿舍管理系统— 数据结构与整体架构设计 + 核心代码深度解析

DormOne|基于 Flutter × HarmonyOS 6.0 的新生宿舍管理系统— 数据结构与整体架构设计 + 核心代码深度解析

DormOne|基于 Flutter × HarmonyOS 6.0 的新生宿舍管理系统— 数据结构与整体架构设计 + 核心代码深度解析 前言 随着高校信息化建设的加速,新生入学流程已经逐步从“人工登记”转向“智能管理”。宿舍分配、入住登记、通知公告、报修反馈等场景高度碎片化、数据结构复杂,传统 Web 管理后台已难以满足高并发与移动端实时交互的需求。 本项目以 Flutter × HarmonyOS 6.0 为技术基座,设计并实现一套面向高校的新生宿舍管理系统 —— DormOne(宿舍一站式管理平台),实现“分配透明、流程可视、管理智能”。 背景 传统宿舍管理存在的问题 问题说明信息割裂教务系统、后勤系统、人工登记不互通流程混乱新生不清楚入住步骤数据不可视管理员难以统计入住状态通知滞后重要公告无法触达学生跨平台困难安卓 / 鸿蒙 / iOS 多套代码 Flutter × HarmonyOS 6.0 跨端开发介绍 为什么选择

By Ne0inhk

从零开始:Codex CLI 在 Mac 上的安全部署与权限管理

从零开始:Codex CLI 在 Mac 上的安全部署与权限管理 1. 环境准备与基础安全考量 在 macOS 上部署 Codex CLI 时,安全应该从环境准备阶段就开始考虑。不同于简单的安装教程,我们需要关注每个环节的潜在风险。 系统要求检查清单: * macOS 12 或更高版本(确保获得完整的安全更新支持) * Node.js 22+(LTS 版本,避免使用不受支持的旧版本) * npm 10+(最新稳定版) * 至少 8GB 内存(避免因资源不足导致异常行为) 重要提示:永远不要使用 sudo 安装 npm 包,这会导致全局包安装目录的权限问题。如果遇到权限错误,应该通过 npm config set prefix 调整安装路径。 推荐的安全实践:

By Ne0inhk