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

为什么我的OpenClaw安装后无法启动?Gateway服务故障排查全攻略

为什么我的OpenClaw安装后无法启动?Gateway服务故障排查全攻略

为什么我的OpenClaw安装后无法启动?Gateway服务故障排查全攻略 1. 引言 OpenClaw是一款功能强大的自动化工具,但其安装和运行依赖于多个服务组件,其中Gateway服务是核心组件之一。如果Gateway服务无法启动,整个OpenClaw系统将无法正常运行。本文将详细介绍OpenClaw安装后无法启动的常见原因及故障排查方法,帮助你快速定位并解决问题。 2. Gateway服务简介 Gateway服务是OpenClaw的核心组件,负责: * 处理所有API请求 * 管理服务间的通信 * 提供认证和授权 * 处理负载均衡 * 监控系统状态 因此,Gateway服务的正常运行对于OpenClaw至关重要。 3. 常见故障原因 3.1 端口冲突 症状:Gateway服务启动失败,提示端口被占用 原因: * 其他应用正在使用Gateway服务的默认端口(通常为3000) * 之前的OpenClaw进程未完全关闭 解决方案: 1. 查看端口占用情况:

By Ne0inhk
【MySQL飞升篇】分库分表避坑指南:垂直分库vs水平分表,分片键选对才不踩雷

【MySQL飞升篇】分库分表避坑指南:垂直分库vs水平分表,分片键选对才不踩雷

🍃 予枫:个人主页 📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 💻 Debug 这个世界,Return 更好的自己! 引言 当业务数据量突破千万、亿级门槛,单库单表的性能瓶颈会如期而至——查询卡顿、写入超时、扩容困难,每一个问题都足以让后端开发者头大。分库分表(Sharding)作为核心解决方案,却常常让人陷入纠结:垂直分库和水平分表该怎么选?分片键选错会有什么后果?分表后分布式ID、跨库分页、跨库JOIN这些难题又该如何破解?本文从核心概念到实战难题,带你吃透分库分表全流程策略。 文章目录 * 引言 * 一、分库分表核心认知:为什么必须做? * 1.1 单库单表的性能瓶颈根源 * 1.2 分库分表的两大核心方向 * 二、核心拆分策略:垂直分库 vs 水平分表实战 * 2.1 垂直分库:按业务“瘦身”

By Ne0inhk

Flutter 三方库 theme_tailor_annotation 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、多终端一致的主题架构实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 theme_tailor_annotation 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、多终端一致的主题架构实战 在鸿蒙(OpenHarmony)生态的开发中,面对手机、平板、折叠屏及智慧屏等多种屏幕形态,维护一套既美观又严谨的主题系统(Theme System)是一大挑战。传统的 ThemeData 扩展往往冗长且易错。theme_tailor_annotation 为鸿蒙开发者提供了一种基于注解和代码生成的极致主题定义方案。本文将带您领略其架构之美。 前言 什么是 Theme Tailor?它是一套强大的代码生成工具。theme_tailor_annotation 定义了其核心注解(Annotations)。通过这种方式,开发者只需定义一个简单的类,库就会自动生成处理深浅色模式切换、多终端缩放比例及组件级动态样式的样板代码(Boilerplate)。在追求高颜值、高性能的鸿蒙应用实践中,

By Ne0inhk
【案例实战】鸿蒙分布式智能办公应用的架构设计与性能优化

【案例实战】鸿蒙分布式智能办公应用的架构设计与性能优化

目录 一、项目背景与挑战 项目概述 1.1 面临的技术挑战 二、分布式架构设计 2.1 整体架构概览 2.2 组件化设计 2.3 分布式通信机制 三、性能优化实战 3.1 UI渲染优化 3.1.1 虚拟列表实现 3.1.2 懒加载和预加载策略 3.2 内存管理优化 3.2.1 内存泄漏检测与修复 3.2.2 对象池与资源复用 3.3 启动性能优化 四、鸿蒙开放能力接入 4.1 云开发能力集成

By Ne0inhk