【力扣】快乐数,哈希集合+快慢指针+数学

快乐数原题地址

方法一:哈希集合

定义函数getNext(n),返回n的所有位的平方和。一直执行n=getNext(n),最终只有2种可能:

  1. n停留在1。
  2. 无限循环且不为1。

证明:情况1是存在的,如力扣的示例一:

接下来只需证明,反复执行getNext操作,最终一定会无限循环(停留在1可以理解为无限的1->1循环)。

分类讨论:

  1. n的位数小于等于3,那么getNext(n)<=getNext(999)=243,那么反复执行getNext(n),执行244次以上,根据抽屉原理,一定会出现循环。
  2. n的位数大于3,如n为4位数,执行getNext(n)后,n的位数会减小,直到变为情况1。

所以,我们可以使用如下算法:反复执行n=getNext(n),会出现下面3种情况:

  1. n=1,说明原来的n是快乐数。
  2. n不在哈希表中,则把n插入哈希表。
  3. n在哈希表中,且n≠1,说明n已经进入循环,原来的n不是快乐数。
// 方法一:哈希集合
class Solution {// 计算n的所有位的平方和int getNext(int n){int sum = 0;while (n){int digit = n % 10;n /= 10;sum += (digit * digit);}return sum;}
public:bool isHappy(int n) {unordered_set<int> hashtable;while (n != 1){// 若哈希表中没有n,就添加n,否则不是快乐数if (!hashtable.count(n)){hashtable.insert(n);}else{return false;}n = getNext(n);}return true;}
};

方法二:快慢指针(龟兔赛跑、弗洛伊德循环查找算法)

考虑到反复执行n=getNext(n),一定会进入循环,参考判断链表是否带环的思路,定义fast和slow,slow每次执行slow=getNext(slow)一次,fast每次执行fast=getNext(fast)两次,那么slow和fast最终一定会在循环内相遇。若相遇时slow=fast=1,则n为快乐数,否则不是快乐数。

这是因为若链表带环,最终fast和slow一定会入环,且每次fast比slow多走一步,fast和slow的距离缩短一步,最终距离一定会减为0,两者相遇。

// 方法二:快慢指针法
class Solution {// 计算n的所有位的平方和int getNext(int n){int sum = 0;while (n){int digit = n % 10;n /= 10;sum += (digit * digit);}return sum;}
public:bool isHappy(int n) {int slow = n;int fast = getNext(slow);while (slow != fast){// 慢指针一次走一步slow = getNext(slow);// 快指针一次走两步fast = getNext(getNext(fast));}return slow == 1;}
};

方法三:数学

根据方法一所述,反复执行n=getNext(n),n一定会跌为三位数以下,且进入循环。使用硬编码穷举,最终的循环一定是...,4,16,37,58,89,145,42,20,4,...或者...1...

所以只需要提前把循环中的数存储在哈希表中,反复执行n=getNext(n),会出现3种情况:

  1. n在哈希表中,说明已经进入循环,原来的n不是快乐数。
  2. n=1,说明原来的n是快乐数。
  3. n不在哈希表中。
// 方法三:数学
class Solution {// 计算n的所有位的平方和int getNext(int n){int sum = 0;while (n){int digit = n % 10;n /= 10;sum += (digit * digit);}return sum;}
public:bool isHappy(int n) {while (1){// 最终要么为1,要么进入循环if (n == 1){return true;}else if (cycleMembers.count(n)){return false;}n = getNext(n);}}
private:static unordered_set<int> cycleMembers;
};unordered_set<int> Solution::cycleMembers = { 4,16,37,58,89,145,42,20 };

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

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

相关文章

P1808 单词分类

P1808 单词分类 题目描述 Oliver 为了学好英语决定苦背单词&#xff0c;但很快他发现要直接记住杂乱无章的单词非常困难&#xff0c;他决定对单词进行分类。 两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。 例如 AABAC&#xff0c;它和 CBAAA 就可以…

DAY14之二叉树理论基础及递归遍历和迭代遍历

理论基础 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这棵二叉树为满二叉树&#xff0c;也可以说深度为k&#xff0c;有2^k-1个节点的二叉…

2024年微信公众号链接爬取

通过输入&#xff08;或文件导入&#xff09;公众号名称&#xff0c;即可爬取该公众号所有历史文章。 通过公众号官方网站调用API&#xff0c;打开开发者工具后发现有 打开后发现有搜索结果的fakeid&#xff0c;这是每个公众号的标识。 点击某公众号后出现 这是具体公众号文章…

Linux【docker 设置阿里源】

文章目录 一、查看本地docker的镜像配置二、配置阿里镜像三、检查配置 一、查看本地docker的镜像配置 docker info一般没有配置过是不会出现Registry字段的 二、配置阿里镜像 直接执行下面代码即可&#xff0c;安装1.10.0以上版本的Docker客户端都会有/etc/docker 1.建立配置…

Vue3.4+element-plus2.5 + Vite 搭建教程整理

一、 Vue3Vite 项目搭建 说明&#xff1a; Vue3 最新版本已经基于Vite构建&#xff0c;关于Vite简介&#xff1a;Vite 下一代的前端工具链&#xff0c;前端开发与构建工具-CSDN博客 1.安装 并 创建Vue3 应用 npm create vuelatest 创建过程可以一路 NO 目前推荐使用 Vue R…

Java+微信小程序实现智慧家政系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…

阿里云游戏服务器多少钱一个月?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

2024图像消除相关论文大集合

28篇图像填充/Inpainting相关论文 1 CR-Fill: Generative Image Inpainting with Auxiliary Contextual Reconstruction ICCV2021 吐槽DeepFillv2 with CA layer&#xff0c;由于缺乏对缺失区域与已知区域之间对应关系的监督信号&#xff0c;可能无法找到合适的参考特征&…

LeetCode130:被围绕的区域(图的简化版之网格结构上的DFS)

题目 注意&#xff1a; 1 < m, n < 200 board[i][j] 为 ‘X’ 或 ‘O’ 思路 根据一般网格结构上的DFS&#xff0c;或者说岛屿问题&#xff0c;第一反应很容易想到找出所有的‘O’然后开始DFS遍历&#xff0c;改为‘X’。 但是这里有个联通的问题&#xff0c;如果这个…

使用easyExcel 定义表头 字体 格式 颜色等,定义表内容,合计

HeadStyle 表头样式注解 HeadFontStyle 表头字体样式 HeadStyle(fillPatternType FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor 22) HeadFontStyle(fontHeightInPoints 12) 以下为实现效果

华视 CVR-100UC 身份证读取 html二次开发模板

python读卡&#xff1a;python读卡 最近小唐应要求要开发一个前端的身份证读卡界面&#xff0c;结果华视CVR-100UC 的读取界面是在是有点&#xff0c;而且怎么调试连官方最基本的启动程序都执行不了。CertReader.ocx 已成功&#xff0c;后面在问询一系列前辈之后&#xff0c;大…

C++ 模板初阶【函数模板,类模板】

文章目录 泛型编程函数模板概念函数模板的格式函数模板的原理函数模板的实例化隐式实例化:让编译器根据实参推演模板参数的实际类型显式实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 函数模板的匹配规则 类模板概念类模板格式类模板的实例化 泛型编程 在我…