leetcode 面试经典 150 题:快乐数

news2025/1/14 17:47:59
链接快乐数
题序号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

题解

  1. 核心思想:使用哈希表来记录已经出现过的数字,如果在计算过程中某个数字重复出现,说明进入了循环,返回 false;如果最终计算结果为 1,返回 true。
  2. 复杂度:时间复杂度O(logn),因为每次计算下一个数的时间复杂度为 O(logn);空间复杂度O(1),不需要额外的存储空间。
  3. 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 = 3
            sum += digit * digit; // 累加平方
            n /= 10;             // 去掉个位,如果 n = 123,执行 n /= 10 后,n = 12
        }
        return sum;
    }
};
  1. 算法推演
  • 初始值: 输入数字: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 (循环) 这是算法检测非快乐数的重要机制,避免了死循环。

  1. 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 = 3
            sum += 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app无限级树形组件简单实现

因为项目一些数据需要树形展示&#xff0c;但是官网组件没有。现在简单封装一个组件在app中使用&#xff0c;可以无线嵌套&#xff0c;展开&#xff0c;收缩&#xff0c;获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…

4种革新性AI Agent工作流设计模式全解析

文章目录 导读&#xff1a;AI Agent的四种关键设计模式如下&#xff1a;1. 反思2. 工具使用3. 规划4. 多Agent协作 总结内容简介&#xff1a; 导读&#xff1a; AI Agent是指能够在特定环境中自主执行任务的人工智能系统&#xff0c;不仅接收任务&#xff0c;还自主制定和执行…

GO语言实现KMP算法

前言 本文结合朱战立教授编著的《数据结构—使用c语言&#xff08;第五版&#xff09;》&#xff08;以下简称为《数据结构&#xff08;第五版&#xff09;朱站立》&#xff09;中4.4.2章节内容编写&#xff0c;KMP的相关概念可参考此书4.4.2章节内容。原文中代码是C语言&…

Trimble自动化激光监测支持历史遗产实现可持续发展【沪敖3D】

故事桥&#xff08;Story Bridge&#xff09;位于澳大利亚布里斯班&#xff0c;建造于1940年&#xff0c;全长777米&#xff0c;横跨布里斯班河&#xff0c;可载汽车、自行车和行人往返于布里斯班的北部和南部郊区。故事桥是澳大利亚最长的悬臂桥&#xff0c;是全世界两座手工建…

深度学习笔记11-优化器对比实验(Tensorflow)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、导入数据并检查 二、配置数据集 三、数据可视化 四、构建模型 五、训练模型 六、模型对比评估 七、总结 一、导入数据并检查 import pathlib,…

MySQL 16 章——变量、流程控制和游标

一、变量 在MySQL数据库的存储过程和存储函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据 在MySQL数据库中&#xff0c;变量分为系统变量和用户自定义变量 &#xff08;1&#xff09;系统变量 1.1.1系统变量分类 变量由…

【HTML+CSS+JS+VUE】web前端教程-13-Form表单

表单在web网页中用来给用户填写信息,从而能采用户信息,使网页具有交互的功能, 所有的用户输入内容的地方都用表单来写,如登录注册、搜索框。 表单是由容器和控件组成的,一个表单一般应该包含用户填写信息的输入框,提交按钮等,这些输入框,按钮叫做控件,表单就是容器,他…

LabVIEW滤波器功能

程序通过LabVIEW生成一个带噪声的正弦波信号&#xff0c;并利用滤波器对其进行信号提取。具体来说&#xff0c;它生成一个正弦波信号&#xff0c;叠加高频噪声后形成带噪信号&#xff0c;再通过低通滤波器滤除噪声&#xff0c;提取原始正弦波信号。整个过程展示了信号生成、噪声…

linux: 文本编辑器vim

文本编辑器 vi的工作模式 (vim和vi一致) 进入vim的方法 方法一:输入 vim 文件名 此时左下角有 "文件名" 文件行数,字符数量 方法一: 输入 vim 新文件名 此时新建了一个文件并进入vim,左下角有 "文件名"[New File] 灰色的长方形就是光标,输入文字,左下…

Java Web开发进阶——错误处理与日志管理

错误处理和日志管理是任何生产环境中不可或缺的一部分。在 Spring Boot 中&#xff0c;合理的错误处理机制不仅能够提升用户体验&#xff0c;还能帮助开发者快速定位问题&#xff1b;而有效的日志管理能够帮助团队监控应用运行状态&#xff0c;及时发现和解决问题。 1. 常见错误…

《零基础Go语言算法实战》【题目 2-25】goroutine 的执行权问题

《零基础Go语言算法实战》 【题目 2-25】goroutine 的执行权问题 请说明以下这段代码为什么会卡死。 package main import ( "fmt" "runtime" ) func main() { var i byte go func() { for i 0; i < 255; i { } }() fmt.Println("start&quo…

Ubuntu系统Qt的下载、安装及入门使用,图文详细,内容全面

文章目录 说明1 在线安装2 离线安装3 使用Qt Creator创建Qt应用程序并构建运行补充补充一&#xff1a;注册Qt账号 说明 本文讲解Ubuntu系统下安装Qt&#xff0c;包括在线安装和离线安装两种方式&#xff0c;内容充实细致&#xff0c;话多但是没有多余&#xff08;不要嫌我啰嗦…

线形回归与小批量梯度下降实例

1、准备数据集 import numpy as np import matplotlib.pyplot as pltfrom torch.utils.data import DataLoader from torch.utils.data import TensorDataset######################################################################### #################准备若干个随机的x和…

P3884 [JLOI2009] 二叉树问题

题目描述&#xff1a; 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为&#xff1a; - 深度&#xff1a;4 - 宽度&#xff1a;4 - 结点 8 和 6 之间的距离&#xff1a;8 - 结点 7 和 6 之间的距离&#xff1a;3 其中宽度表示二叉树上同一层最多的结点个数&#xff0c;节…

ssm旅游攻略网站设计+jsp

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 需要源码或者定制看文章最下面或看我的主页 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B/S结构介绍 3 …

Qt类的提升(Python)

from PyQt5.QtWidgets import QPushButtonclass apushbutton(QPushButton):def __init__(self, parentNone):super().__init__(parent)self.setText("Custom Button")self.setStyleSheet("background-color: yellow;")上述为一个“模板类”&#xff0c;命名…

kubernetes上安装kubesphere

准备工作 需要配置三台虚拟机 关闭防火墙 systemctl stop firewalldsystemctl disable firewalld 临时关闭selinux setenforce 0 永久关闭selinux vi /etc/selinux/config 安装docker rpm -qa|grep docker yum remove docker* -y rpm -qa|grep docker yum install -y yum-u…

Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …

分页工具代码重构

文章目录 1.common-mybatis-plus-starter1.目录2.PageInfo.java3.PageResult.java4.SunPageHelper.java 1.common-mybatis-plus-starter 1.目录 2.PageInfo.java package com.sunxiansheng.mybatis.plus.page;import lombok.EqualsAndHashCode; import lombok.ToString;impor…

Vue学习二——创建登录页面

前言 以一个登录页面为例子&#xff0c;这篇文章简单介绍了vue&#xff0c;element-plus的一些组件使用&#xff0c;vue-router页面跳转&#xff0c;pinia及持久化存储&#xff0c;axios发送请求的使用。后面的页面都大差不差&#xff0c;也都这么实现&#xff0c;只是内容&am…