专题一 - 双指针 - leetcode 202. 快乐数 | 简单难度

leetcode 202. 快乐数

  • leetcode 202. 快乐数 | 简单难度
    • 1. 题目详情
      • 1. 原题链接
      • 2. 基础框架
    • 2. 解题思路
      • 1. 题目分析
      • 2. 算法原理
      • 3. 时间复杂度
    • 3. 代码实现
    • 4. 知识与收获

在这里插入图片描述

leetcode 202. 快乐数 | 简单难度

1. 题目详情

编写一个算法来判断一个数 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. 原题链接

leetcode 202. 快乐数

2. 基础框架

● Cpp代码框架

class Solution {
public:bool isHappy(int n) {}
};

2. 解题思路

1. 题目分析

( 1 ) (1) (1) 判断一个整数n是否是快乐数:用该数的每个位置的平方和作为新值,一直进行下去,如果最终能得到1就返回false,反之无限循环就返回fasle。
( 2 ) (2) (2) 本题出现的无限循环指的是一个数变成一系列不同的数,直到又变成自身,然后循环往复,这个无限循环中的每个数是确定的。
( 3 ) (3) (3)

2. 算法原理

( 1 ) (1) (1) 首先想到的是一种解法:
模拟数n的变化过程,同时使用哈希表记录每次变化的新数new_n,判断每次变化的新数new_n是否是1
如果是1就是快乐数;
如果不是1就在哈希表中查找new_n自身是否已经出现过了:
————如果在哈希表中找到了自身就说明new_n出现过了,且new_n不是1,说明已经进入无限循环了,即数n一定不是快乐数;
继续变化得到下一个new_n,循环判断。
在这里插入图片描述

( 2 ) (2) (2) 第二种解法:快慢指针算法
你知道判断链表是否有环这道题是如何做的呢?
链表是否有环这道题使用了快慢双指针,慢slow每次走1步,快指针fast每次走两步,如果链表有环,最终slowfast会相遇即slow==fast

本题中n数n的变化也可以转换为与求链表是否有环中相类似的情况:
对于数n
情况1:不是快乐数,n经过一系列数的变化最终会变回已经出现的数,然后又从从已经出现得数开始再继续变化,形成无限循环,形象的说就是进入了环;

情况2:如是快乐数,n经过一系列数的变化最终会变到1,而1如果继续变化,那么会一直会回1本身,此时也可以说进入了无限循环,只不过这个无限循环中变化的数都是1本身;

上面两种情况就可以合并为一种情况:数n经过一系列变化,进入循环,快指针fast一次走2步(这里的走两步是形象的说法,实际上表示的是fast变化了两次),慢指针slow一次走1步,最终会进入环,在环中快慢指针最终一定会相遇:
判断两者的值是否相等,相等时说明相遇了,
————然后判断快慢指针的值是否是1
————————如果是1则是快乐数;反之不是快乐数。
在这里插入图片描述

3. 时间复杂度

为了使用n描述时间复杂度,下文描述数n时将会换成数num。

第一种解法 模拟: O ( n ) O(n) O(n),但借助了额外n的空间。

数num的变化长度是确定的,不管是变为1还是进入无限循环。
每次都会记录数num的变化,所以相当于遍历了一遍num的所有变化情况。

第二种解法 快慢指针: O ( n ) O(n) O(n)

3. 代码实现

解法一:模拟

class Solution {
public:int change(int val){int ret = 0;while(val){int mod = val % 10;ret += mod * mod;val /= 10;}return ret;}bool isHappy(int n) {unordered_set<int> us;// 哈希表存储每次出现的新数// 模拟n的变化while(n != 1){if(us.find(n) != us.end()) return false;us.insert(n);n = change(n);}return true;}
};

解法二:快慢双指针

class Solution {
public:int change(int val){int newval = 0;while(val){int mod = val % 10;val /= 10;newval += mod * mod; }return newval;}bool isHappy(int n) {int slow = n, fast = n;do{slow = change(slow);fast = change(fast);fast = change(fast);} while(slow != fast);return slow == 1;}
};

4. 知识与收获

( 1 ) (1) (1) 快慢双指针的应用中,判断是否有环链表是一道经典的题目,本题虽然表面上与其无关,但是在分析之后发现有很大的相关性,也就可以使用快慢指针思路解决了。


T h e The The E n d End End

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

geoserver+mapbox-gl 离线部署矢量切片地图服务学习笔记

geoserver安装 geoserver的安装包可以在官网下载Download - GeoServer&#xff0c;想要选择版本点击Archived找到指定版本进行下载http://geoserver.org/download/ &#xff08;如果网络不稳定&#xff0c;也可以直接使用下面的下载地址&#xff09; geoserver-2.15.0.rar资…

多线程-线程池原子性并发工具类

1.线程池 1.线程状态 虚拟机中线程的六种状态 新建状态&#xff08;NEW&#xff09; --创建线程 就绪状态&#xff08;RUNNABLE&#xff09; --start方法 阻塞状态&#xff08;BLOCKED&#xff09; --无法获得锁对象 等待状态&#xff08;WAITING&#xff09; …

观其大略之HybridCLR学习笔记

问题背景 1 现有热更方案的开发效率、性能没有到达极限&#xff0c;还有提升的空间 2 ios多平台政策导致热更新受限问题&#xff0c;ios禁止jit。根据我查找的资料&#xff0c;ios的代码段启动的时候就确定了&#xff0c;不能增加新的代码段。IOS封了内存&#xff08;或者堆&…

2024软件测试工具测评,总有一款适合你!

在软件开发周期中&#xff0c;测试是确保产品质量的关键环节。随着企业对于软件质量的要求日益提升&#xff0c;测试人员面临着前所未有的挑战&#xff0c;“工欲善其事必先利其器”&#xff0c;选择一款高效、实用的软件测试工具&#xff0c;不仅能够提升测试效率&#xff0c;…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据】操作批量新增、分页查询(四)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本编码方式mybatis☑️☑️3.5.4lambda xml 优化sq…

嘉绩咨询:搭建品牌招商桥梁,提供卓越讲师与会议服务

当下&#xff0c;品牌成功的关键在于强大的渠道支撑和高效的招商能力&#xff0c;在这一背景下&#xff0c;嘉绩咨询&#xff0c;这一专注于渠道招商全案系统孵化的知名平台型企业&#xff0c;今日宣布&#xff0c;将进一步加强其在品牌招商桥梁搭建上的服务功能&#xff0c;通…

[java] 23种设计模式之桥接模式

一、什么是桥接模式 桥接(Bridge)模式属于结构型设计模式。通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。把抽象(abstraction)与行为实现(implementation)分离开来&#xff0c;从而可以保持各部分的独立性以及应对它们的功能扩展。 二、适用场景 当一…

不知道吧,腾讯云轻量应用服务器使用有一些限制!

腾讯云轻量应用服务器相对于云服务器CVM是有一些限制的&#xff0c;比如轻量服务器不支持更换内网IP地址&#xff0c;不支持自定义私有网络VPC&#xff0c;内网连通性方面也有限制&#xff0c;轻量不支持CPU内存、带宽或系统盘单独升级&#xff0c;只能整个套餐整体升级&#x…

Intellij IDEA 中 git 操作的快捷键

1.添加新建的文件 即add 操作 shift alt a 2.提交操作 即 commit操作 ctrl k 在窗口中可以用feature来声明此次更新的内容 3.提交操作 即push操作 ctrl shift k 4.拉去远程分支操作 即pull操作 ctrl t

一个爬虫自动化数据采集的故事~

目录 一、原文二、故事前半段背景内容三、正经的讲点DrissionPage知识四、故事的收尾 一、原文 原文来自一个爬虫自动化数据采集的故事~ , 建议点击链接看文章末尾的视频笔者不擅长自动化&#xff0c;一个小小故事分享给大家&#xff0c;仅个人观点 二、故事前半段背景内容 …

【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge

tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分&#xff0c;其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部&#xff0c;确保只要远程窗口有空间&#xff0c;就可以发送数据。 下面是对该函数的一些主要逻辑的中…

python爬虫(4)

#前期先说明一下为啥爬虫需要学习数组的存储和处理&#xff0c;只是说在你后期接触到最简单的爬虫后有一个地方可以存放你的数据# 下面为大家带来一个我在做excel表整理时的代码以及上次代码的结果 上次代码的结果&#xff1a; 新的代码&#xff1a; import numpy as np im…