每日一题(LeetCode)----哈希表--快乐数

每日一题(LeetCode)----哈希表--快乐数

1.题目(202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

示例 1:

c++ 复制代码
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

c++ 复制代码
输入: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.写出代码

思路一的代码

c++ 复制代码
class Solution {
public:

    int nextInteger(int n){
        int sum=0;
        while(n){
            int i=n%10;
            sum+=i*i;
            n/=10;
        }
        return sum;
    }

    bool isHappy(int n) {
        unordered_set<int> ma;
        while(n!=1&&ma.count(n)==0){
            ma.insert(n);
            n=nextInteger(n);
        }

        return n==1;
    }
};

思路二的代码

c++ 复制代码
class Solution {
public:

    int nextInteger(int n){
        int sum=0;
        while(n){
            int i=n%10;
            sum+=i*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;
    }
};

思路三的代码

c++ 复制代码
class Solution {
public:

    int nextInteger(int n){
        int sum=0;
        while(n){
            int i=n%10;
            sum+=i*i;
            n/=10;
        }
        return sum;
    }

    bool isHappy(int n) {
        unordered_set<int> ma{4,16,37,58,89,145,42,20};
        
        while(n!=1&&ma.count(n)==0){
            n=nextInteger(n);
        }

        return n==1;
    }
};
相关推荐
雾月5530 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
OpenC++1 小时前
【C++QT】Buttons 按钮控件详解
c++·经验分享·qt·leetcode·microsoft
知来者逆2 小时前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊2 小时前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北2 小时前
力扣-160.相交链表
算法·leetcode·链表
爱研究的小陈3 小时前
Day 3:数学基础回顾——线性代数与概率论在AI中的核心作用
算法
渭雨轻尘_学习计算机ing3 小时前
二叉树的最大宽度计算
算法·面试
BB_CC_DD4 小时前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
梁下轻语的秋缘5 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV5 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法