一个专门做各种恐怖片的电影网站,开创集团与百度,西安网站制作顶尖公,wordpress怎么找回密码每日一题(LeetCode)----哈希表–快乐数
1.题目#xff08;202. 快乐数#xff09;
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为#xff1a;
对于一个正整数#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为…每日一题(LeetCode)----哈希表–快乐数
1.题目202. 快乐数
编写一个算法来判断一个数 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
2.解题思路
根据分析我们发现一个数不断替换要么会变为1要么会陷入一个循环
思路一哈希表
1.创建一个哈希表这里我们用unordered_set,用来存我们遍历过的数
2.进行判断 如果这个数不为1且在哈希表中没有出现过那么我们把这个数存到哈希表中然后把这个数进行替换接着继续判断替换后的那个 数 如果这个数为1或者在哈希表中出现过那么我们结束判断将当前的数与1进行比较与1相等那么n就是快乐数否则就是陷入了 循环不是快乐数
思路二快慢指针法
1.定义一个慢指针指向第一个数定义一个快指针指向第一个数进行变换后的数
2.进行判断 如果快指针指向的数不为1且快指针和慢指针没有相遇那么快指针指向当前所指向的数进行两次变换之后的数慢指针指向当前 所指向的数进行一次变换之后的数重新进行判断 如果快指针指向的数为1或者快指针和慢指针相遇了那么结束判断将当前快指针指向的数与1进行比较与1相等那么n就是快乐 数否则就是陷入了循环不是快乐数
思路三数学法
根据分析我们发现下一个值可能比自己大的最大数字必须低于 243。因此我们知道任何循环都必须包含小于 243 的数字用这么小的数字编写一个能找到所有周期的强力程序并不困难。
如果这样做会发现只有一个循环4→16→37→58→89→145→42→20→4。所有其他数字都在进入这个循环的链上或者在进入 1 的链上。
因此我们可以硬编码一个包含这些数字的散列集如果我们达到其中一个数字那么我们就知道在循环中。
思路来源力扣官方题解
链接https://leetcode.cn/problems/happy-number/
3.写出代码
思路一的代码
class Solution {
public:int nextInteger(int n){int sum0;while(n){int in%10;sumi*i;n/10;}return sum;}bool isHappy(int n) {unordered_setint ma;while(n!1ma.count(n)0){ma.insert(n);nnextInteger(n);}return n1;}
};思路二的代码
class Solution {
public:int nextInteger(int n){int sum0;while(n){int in%10;sumi*i;n/10;}return sum;}bool isHappy(int n) {int slow n;int fast nextInteger(n);while (fast ! 1 slow ! fast) {slow nextInteger(slow);fast nextInteger(nextInteger(fast));}return fast 1;}
};思路三的代码
class Solution {
public:int nextInteger(int n){int sum0;while(n){int in%10;sumi*i;n/10;}return sum;}bool isHappy(int n) {unordered_setint ma{4,16,37,58,89,145,42,20};while(n!1ma.count(n)0){nnextInteger(n);}return n1;}
};