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

从“多库并存”到“一库多能”:聊聊金仓KingbaseES的融合架构实践

从“多库并存”到“一库多能”:聊聊金仓KingbaseES的融合架构实践

干数据库这行快十年了,亲眼见证了企业数据架构的变迁。早年做项目,最头疼的就是“数据竖井”——交易系统用Oracle,用户行为日志扔到MongoDB,时序监控数据塞进InfluxDB,图谱关系又得搞个Neo4j。每个库都有自己的语法、管理工具和运维体系,开发团队整天在不同数据库之间做数据同步和格式转换,数据一致性难保证,系统复杂度却直线上升。 这几年“融合数据库”的概念越来越热,但很多厂商的理解还停留在“多模接口”层面。直到去年深度参与了某城商行的核心系统分布式改造项目,用金仓数据库KingbaseES 完整跑了一轮,才算真正体会到什么是“一库多能”的设计哲学。今天就跟大家聊聊我们的实践心得,特别是金仓在这方面的独特思考。 一、为什么是“一库多能”,不是“多库拼装”? 先看个真实场景。我们那个银行客户要做实时反欺诈,需要在一个查询里关联:用户账户信息(结构化)、近期交易流水(带时序特征)、设备指纹(JSON文档)、社交关系图谱(判断是否团伙),以及地理位置信息(空间数据)。如果按传统思路,至少要跨5个不同数据库做联合查询,光数据同步延迟就够受的,更别说保证事务一致性了。

By Ne0inhk

7个理由让TanStack Table成为2024年前端表格库的首选方案

7个理由让TanStack Table成为2024年前端表格库的首选方案 【免费下载链接】tableTanStack/table: TanStack Table (原名 React Table) 是一个灵活且高性能的表格组件库,用于构建复杂数据表视图,适用于React环境,具有高度可配置性和优化的性能表现。 项目地址: https://gitcode.com/gh_mirrors/ta/table TanStack Table是一个功能强大的无头UI库,专为构建高性能数据网格组件设计。它支持React、Vue、Solid等多种前端框架,通过100%控制标记和样式,让开发者能够打造完全定制化的表格解决方案。轻量级架构配合TypeScript原生支持,使它成为处理复杂数据展示的理想选择。 图:TanStack Table v8版本宣传图,展示其无头UI架构理念 从零开始了解TanStack Table 项目基础速览 📚 作为GitHub加速计划中的明星项目,TanStack Table(前身为React Table)采用TypeScript和JavaScript开发,核心代

By Ne0inhk
LangChain 消息处理全解析:缓存、过滤、合并与流式输出实战

LangChain 消息处理全解析:缓存、过滤、合并与流式输出实战

文章目录 * 一、消息内存缓存 * 核心概念 * 关键组件 * 代码流程 * 运行效果 * 二、消息过滤 * 核心概念 * 关键函数 * 过滤参数 * 代码示例 * 过滤逻辑 * 三、消息合并 * 核心概念 * 关键函数 * 代码示例 * 合并效果 * 两种使用方式 * 四、流式输出 * 什么是流式输出 * 为什么需要? * 典型应用 * 五、同步 vs 异步流式 * 核心区别 * 工作原理 * 何时使用异步? * 六、流式输出基础用法 * 同步流式 * 异步流式 * 七、输出解析器 * 八、流式输出实际应用 * 1. 聊天机器人 * 2. 多用户并发 * 3. FastAPI 集成 * 九、常见问题

By Ne0inhk