【面试经典150 | 哈希表】快乐数

news2025/2/26 20:58:37

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:哈希集合判重
    • 方法二:快慢指针判重
  • 其他语言
    • python3
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【哈希集合】【快慢指针】


题目来源

202. 快乐数


题目解读

判断一个数 n 是不是快乐数。


解题思路

在「快乐数」的定义中,我们需要计算整数的每个数位上数字的平方和,需要使用模运算计算每个数位上的数字来对平方和进行累加,这是数位运算的基础操作了,直接贴上代码:

int nextNum(int num) {
    int val = 0;
    while (num) {
        int tmp = num % 10;
        val += tmp * tmp;
        num /= 10;
    }
    return val;
}

接下来需要重复计算各个数位上数的平方和,我们使用 while() 循环来重复这一计算过程,那什么时候退出循环呢?

答:遇到计算结果为 1 的时候,或者某一计算结果在之前已经出现过了。

计算结果为 1 这个很好理解,这也是符合本题对 「快乐数」的定义。退出循环的第二个条件是这样的,如果某个计算结果重复出现了,那么说明在验证「快乐数」的过程中出现了环,那么永远也不会有平方和为 1 的情况。

判断某个计算结果有没有出现过第二次,就是判断链表中是否有环的问题,这一问题有两种解决方法:

  • 哈希集合判重
  • 快慢指针判重

具体原理可以参考 【面试经典150 | 循环链表】。

方法一:哈希集合判重

实现代码

class Solution {
public:
    int nextNum(int num) {
        int val = 0;
        while (num) {
            int tmp = num % 10;
            val += tmp * tmp;
            num /= 10;
        }
        return val;
    }
    
    bool isHappy(int n) {
        unordered_set<int> st;

        while (n != 1 && !st.count(n)) {
            st.insert(n);
            n = nextNum(n);
        }
        return n == 1;
    }
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 是输入的数。

空间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

方法二:快慢指针判重

实现代码

class Solution {
public:
    int nextNum(int num) {
        int val = 0;
        while (num) {
            int tmp = num % 10;
            val += tmp * tmp;
            num /= 10;
        }
        return val;
    }
    
    bool isHappy(int n) {
        
        int slow = n;
        int fast = nextNum(n);

        while (fast != 1 && slow != fast) {
            slow = nextNum(slow);
            fast = nextNum(nextNum(fast));
        }
        return fast == 1;
    }
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 是输入的数。

空间复杂度: O ( 1 ) O(1) O(1)


其他语言

python3

以下两段代码来源于 官方题解。

哈希集合判重

def isHappy(self, n: int) -> bool:

    def get_next(n):
        total_sum = 0
        while n > 0:
            n, digit = divmod(n, 10)
            total_sum += digit ** 2
        return total_sum

    seen = set()
    while n != 1 and n not in seen:
        seen.add(n)
        n = get_next(n)

    return n == 1

快慢指针判重

def isHappy(self, n: int) -> bool:  
    def get_next(number):
        total_sum = 0
        while number > 0:
            number, digit = divmod(number, 10)
            total_sum += digit ** 2
        return total_sum

    slow_runner = n
    fast_runner = get_next(n)
    while fast_runner != 1 and slow_runner != fast_runner:
        slow_runner = get_next(slow_runner)
        fast_runner = get_next(get_next(fast_runner))
    return fast_runner == 1

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

【COMP305 LEC6 LEC 7】

LEC 6 Topic 2. The McCulloch-Pitts Neuron (1943) 1. What kind of propositions can be represented by a single MP neuron (without time)? OR&#xff1a; 中间那条线就是 a1 a2 1 分成了两半&#xff1a;1. on the line 和 above the line 2. below the line …

【计算机网络】NAT机制的工作流程

网络地址转换&#xff08;NAT&#xff09;是一种将私有IP地址转换为公共IP地址的技术&#xff0c;它使得私有网络中的主机可以在互联网上与外部主机进行通信。NAT机制在路由器或专用NAT设备上配置&#xff0c;可以用于家庭、小型企业或大型企业的网络环境中。本文将总结NAT机制…

flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改

flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改 最近使用flutter开发项目&#xff0c;需要将打包应用时候apk进行签名&#xff0c;我这边开发使用的是Android studio&#xff0c;发现在Android studio的build没有generate signed bu…

读高性能MySQL(第4版)笔记18_扩展MySQL

1. 增长 1.1. 在高速的业务环境中&#xff0c;流量可能逐年增长几个数量级&#xff0c;环境会变得更加复杂&#xff0c;随之而来的数据需求也会快速增加 1.2. 扩展Web服务器 1.2.1. 在负载均衡的后端添加更多的服务器节点&#xff0c;而这通常就是扩展We b服务器的全部工作 …

【银河麒麟系统】备份还原工具显示“备份分区空间不足,请删除过期或者不需要的备份”解决方法

一.问题的现象 在进行银行麒麟V10的系统备份时&#xff0c;会因为所需备份的系统过大导致备份分区容量不足导致备份失败的情况&#xff1a; 二.解决方法 该问题的处理思路与之前写过的一篇文章&#xff1a;【linux】把home目录挂载到其他分区&#xff08;数据盘/data等&#xf…

Day8力扣打卡

打卡记录 查找和替换模式&#xff08;哈希表 / find函数查询重复程度&#xff09; 链接 1.hash表双映射检测是否存在相同映射。 2.利用string的find函数返回下标来检测对应字符串的重复程度(妙)。 class Solution { public:vector<string> findAndReplacePattern(vect…

Web APIs——事件监听以及案例

1、事件监听 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为绑定事…

基于斑点鬣狗算法的无人机航迹规划-附代码

基于斑点鬣狗算法的无人机航迹规划 文章目录 基于斑点鬣狗算法的无人机航迹规划1.斑点鬣狗搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用斑点鬣狗算法来优化无人机航迹规划。 …

LiveGBS流媒体平台GB/T28181常见问题-海康大华宇视硬件NVR摄像头通道0未获取到视频通道如何排查如何抓包分析

LiveGBS常见问题海康大华宇视硬件NVR摄像头通道0未获取到视频通道如何排查如何抓包分析&#xff1f; 1、硬件NVR配置接入示例2、通道数为0处置2.1、判断信令是否畅通2.1.1、点击更新通道2.1.2、有成功提示2.1.2.1、确认设备的视频通道编码是否填写2.1.2.2、确认是否超过授权数目…

【ArcGIS模型构建器】03:多个shp批量按属性分割(多个县区批量提取乡镇)

文章目录 一、数据预览二、模型构建三、保存模型一、数据预览 加载实验数据: 本试验实现将两个县区的数据分割为乡镇数据。 二、模型构建 1. 添加数据文件夹 将县区数据所在的根目录文件夹拖进模型。 2. 添加要素类迭代器 插入→迭代器→要素类。 用连接工具,将数据文件…

【计算机网络笔记】网络应用的体系结构

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【C++入门篇】保姆级教程篇【上】

目录 一、第一个C程序 二、C命名空间 1&#xff09;什么是命名空间&#xff1f; 2&#xff09;命名空间的使用 3&#xff09; std库与namespace展开 4&#xff09;命名空间的嵌套使用 三、输入输出方式 四、缺省参数 1&#xff09;什么是缺省参数&#xff1f; 2&#xff0…

html web前端 登录,短信验证码登录

html web前端 登录&#xff0c;短信验证码登录 1&#xff0c;手机号码格式校验 2&#xff0c;按钮点击60秒倒计时&#xff0c;按钮限制点击 3&#xff0c;验证码/或密码长度校验&#xff08;被注释&#xff0c;公司发的验证码长度不一致&#xff0c;不一定是6位&#xff09; 4…

LabVIEW应用开发——控件的使用(三)

接上文&#xff0c;这篇介绍簇Cluster控件。 LabVIEW应用开发——控件的使用&#xff08;二&#xff09; 1、簇Cluster 1&#xff09;创建 蔟控件又称为组合、集群控件&#xff0c;顾名思义它是一个类似于C语言的结构体的一个数据结构控件。在描述一个对象的时候&#xff0c;…

SAP POorPI RFC接口字段调整后需要的操作-针对SP24及以后的PO系统

文章目录 问题描述解决办法 问题描述 在SAP系统的RFC接口结构中添加了字段&#xff0c;RFC也重新引用到了PO系统&#xff0c;Cache和CommunicationChannel都刷新或启停了&#xff0c;但是新增的字段在调用接口的时候数据进不到SAP系统&#xff0c;SAP系统内的值也出不来。经过…

图像处理之《基于多MSB预测和Huffman编码的加密图像可逆数据隐藏》论文精读

一、文章摘要 随着云存储和隐私保护的发展&#xff0c;可逆数据隐藏在加密图像中(RDHEI)作为一种技术越来越受到人们的关注&#xff0c;它可以&#xff1a;在图像加密领域嵌入额外的数据&#xff0c;确保嵌入的数据可以无差错地提取&#xff0c;原始图像可以无损地恢复。本文提…

安卓 实现60s倒计时的CountDownTimer(小坑)

安卓 实现60s倒计时的CountDownTimer&#xff08;小坑&#xff09; 前言一、CountDownTimer 是什么&#xff1f;二、代码示例1.使用2.小坑的点误差及时取消 总结 前言 前段时间写倒计时没有用线程&#xff0c;想换一种实现方式结果踩了个小坑&#xff0c;特此记录。 一、Count…

no main manifest attribute, in xxx.jar

使用Docker运行一个SpringBoot应用时&#xff0c;出现如下图所示的错误信息 解决方案&#xff1a; SpringBoot应用的pom.xml文件中添加以下配置;重新打包即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifac…

计算机网络——理论知识总结(上)

开新番&#xff0c;因为博主备考的学校计网只考察1/6的分值&#xff0c;而且定位偏向于送分题&#xff0c;因此在备考时并没有很高强度的复习。本帖基于王道考研的教辅总结归纳&#xff0c;虽然是408的教材&#xff0c;但忽略其中有难度的部分&#xff0c;如计算题、画图题等&a…

18.Raising and Lower Indexs

提高和降低张量索引 同样&#xff0c;使用的是非标准的符号。 我们对V和熟悉&#xff0c;一个是向量所在的空间&#xff0c;一个是协向量所在的 对偶空间 &#xff0c; 有一个问题&#xff1a; 有何办法能在V的向量与 的协向量之间 建立对应的关系&#xff1f; 换句话说&…