leetcode 面试经典 150 题:快乐数
| 链接 | 快乐数 |
|---|---|
| 题序号 | 202 |
| 题型 | 数组 |
| 解题方法 | 哈希表 |
| 难度 | 简单 |
| 熟练度 | ✅✅✅✅ |
题目
-
编写一个算法来判断一个数 n 是不是快乐数。
-
[快乐数] 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。 -
示例 1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12+ 02 + 02 = 1 -
示例 2:
输入:n = 2
输出:false -
提示:
1 <= n <= 231 - 1
题解
- 核心思想:使用哈希表来记录已经出现过的数字,如果在计算过程中某个数字重复出现,说明进入了循环,返回 false;如果最终计算结果为 1,返回 true。
- 复杂度:时间复杂度O(logn),因为每次计算下一个数的时间复杂度为 O(logn);空间复杂度O(1),不需要额外的存储空间。
- c++ 实现算法:
class Solution {
public:bool isHappy(int n) {unordered_set<int> seen; // 用于存储已经出现过的数字,检测循环//如果 find(n) 返回 seen.end(),表示 n 不存在于集合中,查找失败。//如果 find(n) 返回的迭代器不是 seen.end(),表示 n 存在于集合中,查找成功。while (n != 1 && seen.find(n) == seen.end()) {seen.insert(n); // 将当前数字加入集合n = getNext(n); // 计算下一步的平方和}return n == 1; // 如果 n == 1,返回 true;否则进入循环,返回 false}private:int getNext(int n) {int sum = 0;while (n > 0) {int digit = n % 10; // 提取个位数,如果 n = 123,则 digit = 123 % 10 = 3sum += digit * digit; // 累加平方n /= 10; // 去掉个位,如果 n = 123,执行 n /= 10 后,n = 12}return sum;}
};
- 算法推演:
初始值: 输入数字:n = 2 seen 集合:空集合 {}
第一步:计算平方和
当前数字:n = 2
计算平方和: 22=4
更新数字:n = 4 检查 4 是否在 seen 集合中:否,将 4 加入集合。
集合更新为:{2}第二步:计算平方和
当前数字:n = 4
计算平方和: 42=16
更新数字:n = 16 检查 16 是否在 seen 集合中:否,将 16 加入集合。
集合更新为:{2, 4}第三步:计算平方和
当前数字:n = 16
计算平方和: 12+62=37
更新数字:n = 37 检查 37 是否在 seen 集合中:否,将 37 加入集合。
集合更新为:{2, 4, 16}第四步:计算平方和
当前数字:n = 37
计算平方和: 32+72=58
更新数字:n = 58 检查 58 是否在 seen 集合中:否,将 58 加入集合。
集合更新为:{2, 4, 16, 37}第五步:计算平方和
当前数字:n = 58
计算平方和: 52+82=89
更新数字:n = 89 检查 89 是否在 seen 集合中:否,将 89 加入集合。
集合更新为:{2, 4, 16, 37, 58}第六步:计算平方和
当前数字:n = 89
计算平方和: 82+92=145
更新数字:n = 145 检查 145 是否在 seen 集合中:否,将 145 加入集合。
集合更新为:{2, 4, 16, 37, 58, 89}第七步:计算平方和
当前数字:n = 145
计算平方和: 12+42+52=42
更新数字:n = 42 检查 42 是否在 seen 集合中:否,将 42 加入集合。
集合更新为:{2, 4, 16, 37, 58, 89, 145}第八步:计算平方和
当前数字:n = 42
计算平方和: 42+22=20
更新数字:n = 20 检查 20 是否在 seen 集合中:否,将 20 加入集合。
集合更新为:{2, 4, 16, 37, 58, 89, 145, 42}第九步:计算平方和
当前数字:n = 20
计算平方和: 22+02=4
更新数字:n = 4 检查 4 是否在 seen 集合中:是,说明进入循环。结论
输入 2 会进入循环,无法到达 1,因此 2 不是一个快乐数。循环检测
通过集合 seen,我们检测到了循环路径: 2 → 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 (循环) 这是算法检测非快乐数的重要机制,避免了死循环。
- c++ 完整demo:
#include <iostream>
#include <unordered_set>
using namespace std;class Solution {
public:bool isHappy(int n) {unordered_set<int> seen; // 用于存储已经出现过的数字,检测循环//如果 find(n) 返回 seen.end(),表示 n 不存在于集合中,查找失败。//如果 find(n) 返回的迭代器不是 seen.end(),表示 n 存在于集合中,查找成功。while (n != 1 && seen.find(n) == seen.end()) {seen.insert(n); // 将当前数字加入集合n = getNext(n); // 计算下一步的平方和}return n == 1; // 如果 n == 1,返回 true;否则进入循环,返回 false}private:int getNext(int n) {int sum = 0;while (n > 0) {int digit = n % 10; // 提取个位数,如果 n = 123,则 digit = 123 % 10 = 3sum += digit * digit; // 累加平方n /= 10; // 去掉个位,如果 n = 123,执行 n /= 10 后,n = 12}return sum;}
};int main() {Solution solution;int n = 2;if (solution.isHappy(n)) {cout << n << " is a happy number!" << endl;} else {cout << n << " is not a happy number!" << endl;}return 0;
}
相关文章:
leetcode 面试经典 150 题:快乐数
链接快乐数题序号202题型数组解题方法哈希表难度简单熟练度✅✅✅✅ 题目 编写一个算法来判断一个数 n 是不是快乐数。 [快乐数] 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1࿰…...
Leetcode 279. 完全平方数 动态规划 完全背包问题
原题链接:Leetcode 279. 完全平方数 class Solution { public:int numSquares(int n) {vector<int> dp(n 1, 0);for (int i 1; i < n; i) {int tmp INT_MAX;for (int j 1; j * j < i; j) {tmp min(tmp, dp[i - j * j]);}dp[i] tmp 1;}return dp[…...
python学opencv|读取图像(三十三)阈值处理图像-限定像素
【1】引言 前序我们已经掌握分解图像的通道,设置各个通道的RGB值,相关文章包括且不限于: python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分-CSDN博客 python学opencv|读取图像(十五)B…...
QT Quick QML 实例之椭圆投影,旋转
文章目录 一、前言二、演示三、部分代码与分析 QML 其它文章请点击这里: QT QUICK QML 学习笔记 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 一、前言 此 Demo 主要用于无人机吊舱视角的模拟…...
炸砖块游戏的最终图案
描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…...
LLM的实验平台有哪些:快速搭建测试大语言模型
LLM的实验平台有哪些:快速搭建测试大语言模型 目录 LLM的实验平台有哪些:快速搭建测试大语言模型低代码平台工程观测平台本地应用平台在线编程竞技场性能排名代码质量评估开源框架Hugging Face是一个机器学习和数据科学平台及社区主要功能开源工具与库应用场景优势低代码平台…...
python3GUI--大屏可视化-XX产业大数据指挥舱(附下载地址) By:PyQt5
文章目录 一.前言二.预览三.软件开发心得1.使用方法2.UI设计3.代码架构4.项目结构 四.代码片段分享1.图片平滑缩放组件2.滚动日志组件 五.心得体会 大小:35.0 M,软件安装包放在了这里! 本软件未…...
.NET 9.0 的 Blazor Web App 项目中 Hash 变换(MD5、Pbkdf2) 使用备忘
一、生成 string 对应的 MD5 码 /// <summary>/// 生成 string 对应的 MD5 码/// </summary>/// <param name"str">需要转换的字符串 string:用于登录认证时,str username 线下传递的key DateTime.Now.Ticks.ToString() …...
uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture
项目场景: uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture,在实现点击头像需要出发抖音小程序获取用户原生头像的操作中,无论如何也无法触发抖音的原生窗口! 问题描述 这个问题我找了很多博主的方法ÿ…...
(undone) MIT6.S081 2023 学习笔记 (Day5: LAB4 traps)
LAB 网页:https://pdos.csail.mit.edu/6.S081/2023/labs/traps.html 任务1:RISC-V assembly (完成) 初步看问题要求,这是一道文科题(问答题) 在你的 xv6 仓库中有一个文件 user/call.c。执行 make fs.img 会对其进行编译,并生成…...
前端笔记----
在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架,也是用来写界面的,但是那是用来写客户端的,而html是用来写web浏览器的,相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…...
学习华为熵减,激发组织活力
目录 为什么学习华为? 学习华为什么? 一、势:顺势而为,在风口上猪都会飞起来。 二、道:就是认识和利用规律层面,文化和制度创新就是企业经营之道。 三、法:就是一套价值管理的变革方法论。…...
9Hive数据倾斜
这里写目录标题 数据倾斜问题剖析数据倾斜解决方案1. 空值引发的数据倾斜2. 不同数据类型引发的数据倾斜3. 不可拆分大文件引发的数据倾斜4. 数据膨胀引发的数据倾斜5. 表连接时引发的数据倾斜6. 确实无法减少数据量引发的数据倾斜 总结 数据倾斜问题剖析 数据倾斜是分布式系统…...
【大数据】机器学习 -----关于data.csv数据集分析案例
打开表 import pandas as pd df2 pd.read_csv("data.csv",encoding"gbk") df2.head()查看数据属性(列标题,表形状,类型,行标题,值) print("列标题:",df2.columns)Data…...
深入解析 C++ 类型转换
简介 C 类型转换是开发者必须掌握的重要技能之一, 无论是处理隐式转换还是显式转换, 理解其背后的机制与用法至关重要. 本篇博客旨在从基础到高级全面解析 C 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...
C++ union 联合(八股总结)
union(联合体)允许在同一内存位置上存储不同的数据类型,所有成员共享相同的内存空间。 内存布局 由于联合体的所有成员都共享同一块内存,因此联合体的大小是其最大成员的大小。联合体的实际大小取决于其最大成员的类型和对齐要求…...
聊聊AI Agent
什么是AI Agent? AI Agent指的是一种使用人工智能技术的自主实体,它能够感知环境、做出决策,并采取行动以实现特定目标。AI Agent的核心思想是它能够独立运作,基于输入信息做出有根据的决策,并通过学习算法不断提高自…...
scala代码打包配置(maven)
目录 mavenpom.xml打包配置项(非完整版,仅含打包的内容< build>)pom.xml完整示例(需要修改参数)效果说明 maven 最主要的方式还是maven进行打包,也好进行配置项的管理 以下为pom文件(不要…...
慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)
3.UI模板 当我们选择一条已经建好的业务对象点击功能按钮【UI模板】进入该业务对象的UI显示配置界面。 右边填写的是UI模板的编码以及对应名称;菜单界面配置以业务对象UI模板编码获取显示界面。 3.1【列表-按钮】 展示的对应业务对象界面的功能按钮配置࿱…...
C++使用minio-cpp库在minio中创建bucket
直接看代码 #include <iostream> #include <string>#include "miniocpp/client.h"int main() {minio::s3::BaseUrl baseUrl("base url");minio::creds::StaticProvider staticProvider("access key", "secret key");mini…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
