【C++】双指针算法:快乐数

ops/2025/1/16 5:56:31/

1.题目

题目中一定要理解快乐数的含义,否则题目难度直逼困难。
在示例1中n=19,经过几步操作后结果变成1。

那么示例2中n=2是什么情况呢:

2->4->16->37->58->89->145->42->20->4(与前面的4形成闭环)

在计算机中int所能存储的数据范围内,只有这两种情况,没有第三种情况,稍后我会进行简单证明,这个证明过程并不重要,能看懂就行。

2.算法思路

那么如何把示例1和示例2联系在一起呢:

其实示例1最终的结果也是一个闭环,只不过这个环中只有一个数字1。

而示例二中的闭环无非就是不止一个数,且不可能有1。

我们就可以通过闭环中有没有1来判断这个数是否是快乐数。

回到算法本身,我们的算法是双指针,但是这道题目只是单纯的数字,难道真的需要定义一个实实在在的指针嘛?其实不是,双指针只是一个思想,像我的前两篇文章中的数组下标可以代表指针,在这篇文章中一个数字也可以代表指针!思想相同,就属于同一类算法

那么这道题目就可以用快慢指针来解决,定义一个慢指针slow,和一个快指针fast。慢指针进行一次操作,快指针进行两次操作,因为最后的结果是一个闭环,所以快慢指针一定会相遇,相遇时判断它们是否等于1。等于1就是快乐数,否则就不是。

3.提交结果与代码实现

class Solution {
public:int GetSum(int x){int sum=0;while(x){int a=x%10;x/=10;sum+=a*a;}return sum;}bool isHappy(int n) {int slow=n,fast=n;do{slow=GetSum(slow);//慢指针走一步fast=GetSum(GetSum(fast));//快指针走两步}while(slow!=fast);return slow==1;}
};

4.证明一定存在闭环

在计算机中int所能存储的最大数字是2^31。这是一个十位数,拿最大的十位数来说,经过一次题目中所述的操作,结果就是:10*9^2=810。

也就是说,从0到2^31之间的所有数字经过一次操作后所得的结果一定在落在【1,810】这个区间之内,所以在0到2^31之间任意一个数经过811次操作后,每一次操作的结果一定都落在【1,810】区间内,而这个区间一共有810个整数,811次操作会得到811个整数,就一定可以推出至少有两次操作的结果是相等的!

这个原理就是鸽巢原理,意思就是有n个巢,n+1个鸽子,那么一定只少有一个巢中有两只鸽子!


http://www.ppmy.cn/ops/13205.html

相关文章

QT中使用QTableView控件

1.与数据库连接&#xff0c;读取数据库内容到UI界面显示 // 连接SQLite数据库db QSqlDatabase::addDatabase("QSQLITE","second");db.setDatabaseName("./testitem.db"); // 替换为你的数据库文件路径if (!db.open()) {qDebug() << &quo…

Ubuntu修改DNS

【永久修改DNS】 临时修改DNS的方法是在 /etc/resolv.conf 添加&#xff1a;nameserver 8.8.8.8 nameserver 8.8.8.8 注意到/etc/resolv.conf最上面有这么一行&#xff1a; DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN 说明重启之后这个文件会被自动…

计算机网络 2.3数据交换技术

第三节 数据交换技术 定义&#xff1a;两台计算机利用通信线路&#xff0c;通过多个转接节点&#xff0c;进行发送的数据通信方式。 一、电路交换 1.描述&#xff1a;通过网络节点在工作站之间建立专用的通信通道&#xff0c;即建立实际的物理连接。 2.过程&#xff1a;电路建…

FreeSWITCH rtp 统计

现在能想到的是几个办法&#xff1a; 1. cdr 增加下面元素&#xff1a; rtp_audio_in_raw_bytes rtp_audio_in_media_bytes rtp_audio_in_packet_count rtp_audio_in_media_packet_count rtp_audio_in_skip_packet_count rtp_audio_in_jb_packet_count rtp_audio_in_dtmf_pac…

Django中间件的源码解析流程(上)——中间件载入的前置

目录 1. ​前言​ 2. 请求的入口 3. 中间件加载的入口 4. 源码中的闭包实现 5. 最后 1. 前言 哈喽&#xff0c;大家好&#xff0c;我是小K,今天咋们分享的内容是&#xff1a;在学会Django中间件之后&#xff0c; 我们继续深入底层源码。 在执行中间件时请求到来总是从前往后…

小红书笔记的规则权重算法7个要点

1.笔记原创度 小红书平台非常重视用户创作的独特性和原创性。因此&#xff0c;在评估笔记的权重时&#xff0c;原创度是一个重要的考量因素。用户可以通过提供独特的观点、个人经验和创意内容来提高笔记的原创度。 2.笔记内容是否违规 小红书作为一个社区平台&#xff0c;对用户…

游戏自动脚本挂机可行性分析

随着科技的不断发展,自动化和智能化技术逐渐渗透到我们生活的各个方面。在游戏领域,自动脚本挂机技术也应运而生,为玩家提供了一种全新的游戏方式。那么,游戏自动脚本挂机到底可行吗?本文将从多个角度进行深入分析。 一、游戏自动脚本挂机的定义与功能 游戏自动脚本挂机…

【设计模式】单例模式|最常用的设计模式

写在前面 单例模式是最常用的设计模式之一&#xff0c;虽然简单&#xff0c;但是还是有一些小坑点需要注意。本文介绍单例模式并使用go语言实现一遍单例模式。 单例模式介绍 简介 单例模式保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 使用场景&#…