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 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

文章目录 * **第一部分:引言与核心密码学概念** * **1.1 为什么IM需要端到端加密(E2EE)?** * **1.2 核心密码学概念与工具** * **第二部分:方案一:静态非对称加密(基础方案)** * **2.1 方案概述与流程** * **2.2 前端Vue实现(使用node-forge)** * **1. 安装依赖** * **2. 核心工具类 `crypto.js`** * **3. Vue组件中使用** * **2.3 后端Java实现(Spring Boot)** * **1. 实体类** * **2. Controller层** * **3. WebSocket配置** * **2.4 密钥管理、注册与登录集成** * **1. 用户注册/登录时生成密钥** * **2. 密钥设置页面** * **2.

By Ne0inhk
前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

在 AI 辅助编程领域,长期以来似乎存在一条不成文的铁律:如果你想要最好的结果,就必须为最昂贵的模型买单(通常是 Anthropic 或 OpenAI 的旗舰模型)。然而,随着国产大模型如 GLM 4.7 和 MiniMax M2.1 的迭代,这一格局正在发生剧烈震荡。 最近,一场针对Claude Opus 4.5、Gemini 3 Pro、GLM 4.7 和 MiniMax M2.1 的前端 UI生成横向测评,打破了许多人的固有认知。在这场包含落地页、仪表盘、移动端应用等五个真实场景的较量中,不仅出现了令人咋舌的“滑铁卢”,更诞生了性价比极高的“新王”。 本文将深入拆解这场测试的细节,透过代码生成的表象,探讨大模型在工程化落地中的真实效能与成本逻辑。

By Ne0inhk
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * JavaScript 正则表达式详解 * 什么是正则表达式🤔 * JavaScript 正则表达式的定义与使用🥝 * 1. 字面量语法 * 2. 常用匹配方法 * test() 方法🍋‍🟩 * exec() 方法🍋‍🟩 * 正则表达式的核心组成部分🐦‍🔥 * 1. 元字符 * 边界符 * 量词 * 字符类 * 2. 修饰符 * 简单示例🍂 JavaScript 正则表达式详解 正则表达式是处理字符串的强大工具,在 JavaScript 中被广泛应用于表单验证、文本处理和数据提取等场景。本文将从正则表达式的基本概念出发,详细介绍其语法规则和实际应用方法。 什么是正则表达式🤔 正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript

By Ne0inhk