双指针(3)_快慢指针_快乐数问题

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

双指针(3)_快慢指针_快乐数问题

收录于专栏【经典算法练习
本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1.题目链接:

2.题目描述:

3.解法:

算法思路:

算法流程:

代码展示:

结果分析:

4.总结:


 

1.题目链接:

202. 快乐数 - 力扣(LeetCode)

2.题目描述:

编写一个算法来判断一个数 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

3.题目分析:

为了方便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平方和」这一个操作记为x

题目告诉我们,当我们不断重复 x 操作的时候,计算一定会「死循环」,死的方式有两种:

        ▪ 情况一:一直在 1 中死循环,即 1 -> 1 -> 1 -> 1......

        ▪ 情况二:在历史的数据中死循环,但始终变不到 1

由于上述两种情况只会出现一种,因此,只要我们能确定循环是在「情况一」中进行,还是在「情况二」中进行,就能得到结果。

示例一:

示例二: 

简单证明: 

a. 经过一次变化之后的最大值是: 9^2 * 10 = 810 ,也就是在题目要求变化的区间 [1, 2^31-1=2147483647] ,选一个更大的最大( 999999999 ), 也就是变化区间在[1, 810] 之间;

b. 根据「鸽巢原理」(n个巢,n+1个鸽,至少有一个巢里面的鸽子数大于1),一个数变化 811 次之后,必然会形成⼀个循环;

c. 因此,变化的过程最终会走到⼀个圈里面,因此可以用「快慢指针」来解决。

4.解法:

算法思路:

根据上述的题目分析,我们可以知道,当重复执行 x 的时候,数据会陷入到一个「循环」之中。 而「快慢指针」有一个特性,就是在一个圆圈中,快指针总是会追上慢指针的,也就是说他们总会相遇在一个位置上。如果相遇位置的值是 1 ,那么这个数一定是快乐数;如果相遇位置不是 1 的话,那么就不是快乐数。

证明为什么两个快慢指针一定会相遇?两个快慢指针为什么相遇点是入环的起始点?

这个我就不过多证明,详细证明大家可以看下面的博客,里面关于链表的带环问题进行了详细的分析与证明:

链表经典面试题02--链表的带环问题-CSDN博客

算法流程:

1. 单独实现将每个数的位数进行平方求和的函数(因为在题目中会多次使用)

2. 定义两个快慢指针slow和fast

3. 当我们的slow != fast时,说明slow还没与fast相遇,那么slow++,fast += 2;

    当我们的slow == fast时,说明slow与fast相遇,且相遇点是入环起始点,那么我们只需要判断这个点的值是否为1,为1则为快乐数,否则不是.

注意:我们的循环判断条件为slow != fast,那么我们两个指针初始化时,不能同时初始化为n,应该将slow = n, fast = n各个位数的平方和;

代码展示:

class Solution {
public:int numsum(int n){int sum = 0;while(n){int x = n % 10;sum += x * x;n /= 10;}return sum;}bool isHappy(int n) {int slow = n, fast = numsum(n);while(slow != fast){slow = numsum(slow);fast = numsum(numsum(fast));}if(slow == 1) return true;else return false;}
};

结果分析:

顺利通过!!! 

4.总结:

这道题考察了双指针算法中的快慢指针,快慢指针在平常算法中还算比较常见,希望大家可以通过这道题掌握这种算法,如果大家还想练习的话,可以参考下面的博客--有关链表的带环问题,进行加深练习!!!

链表经典面试题02--链表的带环问题-CSDN博客

对了,如果这篇博客对你有帮助的话,不要忘记赞👍 收藏✨ 留言✉ 加关注💓哦!!
大家也可以订阅我的经典算法专辑[经典算法练习],每天都会更新一道经典算法(正常来说),让你遇到算法不在害怕!!!

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

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

相关文章

STM32F1 HAL库笔记0

参考UM1850 Description of STM32F1 HAL and low-layer drivers 1、STM32Cube 包括&#xff1a; • STM32CubeMX&#xff0c;图形软件配置工具&#xff0c;使用图形向导生成 C 初始化代码。 • 嵌入式软件平台&#xff0c;按系列提供&#xff08;例如用于STM32F1的STM32CubeF…

Android Studio gradle下载太慢了!怎么办?(已解决)

Android Studio&#xff01;你到底干了什么&#xff1f;&#xff01; 不能高速下载gradle&#xff0c;我等如何进行app编程&#xff1f;&#xff01; 很简单&#xff0c;我修改gradle地址不就是了。 找到gradle-wrapper.properties文件 修改其中distributionUrl的地址。 将 ht…

本地电脑交叉编译ffmpeg 到 windows on arm64

本地电脑交叉编译ffmpeg 到 windows on arm64 我这里有编译好的win on arm 的 ffmpeg : https://github.com/wmx-github/ffmpeg-wos-arm64-build 使用 llvm-mingw 工具链 https://github.com/mstorsjo/llvm-mingw/releases 前缀 aarch64-w64-mingw32- 这个库是ubuntu 交叉编译…

ES配合高德地图JS-API实现地理位置查询

目录 实现功能点 技术选型 具体实现 Vue3整合高德地图JS API-2.0 添加商户&#xff1a;前端 添加商户&#xff1a;后端/ES 查询用户当前地理坐标 获取附近&#xff08;指定距离&#xff09;的商户 总结/测试Demo代码地址 测试概述&#xff1a;用户使用高德地图组件获取商户…

SpringBoot2:学SpringBoot前的知识准备-用IDEA创建传统的webapp工程,并整合SpringMVC

1、IDEA创建工程 基于Maven模板创建的SpringMVC工程 工程创建好后&#xff0c;只有webapp目录 这里&#xff0c;我们需要手动创建java目录和resources配置文件目录 创建好后&#xff0c;配置下目录属性 最终结构 至此&#xff0c;工程就创建好了 2、配置Tomcat 参考&am…

论文笔记:2023顶会SIGIR - Strategy-aware Bundle Recommender System

论文笔记&#xff1a;2023顶会SIGIR - Strategy-aware Bundle Recommender System

【Python报错已解决】`Provisional headers are shown Learn more`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述&#xff1a;1.1 报错示例&#xff1a;1.2 报错分析&#xff1a;1.3 解决思路&#xff…

145. 利用 Redis Bitmap实践: 用户签到统计

文章目录 一、Redis Bitmap简介二、Bitmap 的主要应用三、Go使用Redis实现签到统计用户签到查询用户签到状态统计今年累计签到天数统计当月的签到情况 总结 在现代应用程序中&#xff0c;用户签到是一个常见的功能。我们通常使用 MySQL 数据库来存储用户的签到记录。然而&#…

智能家居系统(基于STM32F103C8T6标准库+FreeRTOS+Qt串口开发实现)

视频演示&#xff1a;基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目_哔哩哔哩_bilibili 基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目: https://pan.baidu.com/s/1f41gAfOOnlcQoKoMx3o84A?pwd6j2g 提取码: 6j2g 注&#xff1a;本项目为学习完…

Windows I/O系统

硬件存储体系 寄存器 处理器内部定义的存储体&#xff0c;它们除了存储功能&#xff0c;往往还兼有其他的能力&#xff0c;比如参与运算&#xff0c;地址解析&#xff0c;指示处理器的状态&#xff0c;等等。寄存器是由处理器内部专门的触发器电路实现的&#xff0c;处理器往…

自动驾驶坐标转换(代码)

文章目录 1. lidar2ego 和 lidar2cam1.1 lidar2ego1.2 lidar2cam1.3 cam2img2. bev和ego的转换2.1 ego2bev2.2 bev2ego3 3d和2d坐标转换4 车道线插值5 车道线点的过滤6 畸变校正7 绘图7.1 3D lane7.2 绘制2d点1. lidar2ego 和 lidar2cam 1.1 lidar2ego 从.json标注文件中,解…

2024年高教杯国赛(B题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

C#基础(2)枚举

前言 我们其实在前面已经了解过枚举到底有什么作用&#xff0c;但是那毕竟是概念性的语言&#xff0c;理解起来很抽象&#xff0c;今天我们会具体来讲一讲枚举&#xff0c;并谈一谈它的应用。 希望你能从今天的C#基础中有所收获。 基本概念 1.枚举&#xff1a;是一个比较特…

基于物联网的低成本便携式传感器节点用于火灾和空气污染的检测与报警

目录 摘要 引言 材料和方法 传感器节点 IoT 微控制器 颗粒物传感器 环境和气体传感器 MQTT代理 Node-Red监控平台 系统结构 数据存储 工作描述 实验结果 讨论 结论 致谢 参考文献 这篇论文的标题是《Low-cost IoT-based Portable Sensor Node for Fire and Air…

数据要素大市场打开新局面——数字经济背景下中国特色的数据产权三权分置

前言 数字经济飞速发展的大背景下&#xff0c;无论是数据要素大市场还是数据资产入表的发展和落地&#xff0c;都需要以数据产权基本制度为保障。对数据产权给与恰当的权利定位&#xff0c;有助于让数据成为创造和捕获价值的新经济资源。数据的价值在于使用&#xff0c;而传统…

链表leetcode-1

目录 1.常用技巧 1.1引入虚拟头结点 1.2对于变量&#xff0c;不要太吝啬&#xff0c;可以多定义&#xff0c;方便处理 1.3快慢双指针 2.例题 2.1两数相加 2.2两两交换链表中的节点 2.3重排链表 2.4合并K个升序链表 2.5K个一组翻转链表 1.常用技巧 1.1引入虚拟头结点 可…

【HTTP、Web常用协议等等】前端八股文面试题

HTTP、Web常用协议等等 更新日志 2024年9月5日 —— 什么情况下会导致浏览器内存泄漏&#xff1f; 文章目录 HTTP、Web常用协议等等更新日志1. 网络请求的状态码有哪些&#xff1f;1&#xff09;1xx 信息性状态码2&#xff09;2xx 成功状态码3&#xff09;3xx 重定向状态码4&…

场景是人工智能第四要素,是垂直领域人工智能的第一要素。

"场景是人工智能的第四要素&#xff0c;与数据、算力、算法同等重要。"拿着技术找场景&#xff0c;还是拿着场景找技术&#xff1f;这个锤子和钉子的问题&#xff0c;一直困扰着各家AI大厂。从近5年的实践来看&#xff0c;拿着场景找技术是更为稳健的&#xff0c;否则…

哪款宠物空气净化器能更好的清理浮毛?希喂、352、IAM测评分享

家里这三只可爱的小猫咪&#xff0c;已然成为了我们生活中不可或缺的家庭成员&#xff0c;陪伴我们度过了说长不长说短不短的五年时光。时常庆幸自己当年选择养它们&#xff0c;在我失落的时候总能给我安慰&#xff0c;治愈我多时。 但这个温馨的背后也有一点小烦恼&#xff0…

ES6语法详解

以下是ES6常用的一些语法和特性&#xff1a; 声明变量的关键字变化&#xff1a;使用let和const、var来声明变量。 箭头函数&#xff1a;使用箭头&#xff08;>&#xff09;定义函数&#xff0c;简化函数的写法。 模板字符串&#xff1a;使用反引号&#xff08;&#xff0…