Leetcode算法解析——快乐数

1.题目链接:快乐数

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

由于上述两种情况只会出现⼀种,因此,只要我们能确定循环是在「情况⼀」中进⾏,还是在「情

况⼆」中进⾏,就能得到结果。

4.算法思路:

但重复执行x的时候,数据会陷入到一个死循环中,利用快慢指针的特性,快指针和慢指针早晚会相遇。如果相遇位置是1,那么这个数一定是快乐数;如果相遇位置不是1,那么就不是快乐数

5.算法流程图:

5.1快乐数流程图:

5.2非快乐数流程图:

6.C++算法代码:

c++ 复制代码
class Solution {
public:
    //返回n这个数每一位上的平方和
    int Sum(int n)
    {
        //求和
        int sum=0;
        while(n)
        {
             //提取个位
            int t=n%10;
            //计算平方和
            sum+=t*t;
            //干掉个位
            n=n/10;
        }
        return sum;
    }
    bool isHappy(int n) {
        //slow指向n的平方,fast指向n的平方的平方
        int slow=Sum(n),fast=Sum(Sum(n));
        while(slow!=fast)
        {
            slow=Sum(slow);
            fast=Sum(Sum(fast));
        }
        return slow==1;
    }
    
};
相关推荐
倒头就睡的小比特8 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!8 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼9 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光10 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark10 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her110 小时前
并查集-听课笔记
笔记·算法·并查集
码流子11 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven11 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark11 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186111 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法