力扣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

解释:

2 * 2 = 4

4 * 4 = 16

1 * 1 + 6 * 6 = 37

3 * 3 + 7 * 7 = 58

5 * 5 + 8 * 8 = 89

8 * 8 + 9 * 9 = 145

1 * 1 + 4 * 4 + 5 * 5 = 42

4 * 4 + 2 * 2 = 20

2 * 2 = 4

...

题目分析

为了⽅便叙述,将"对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和"这⼀个操作记为 x 操作.

题⽬告诉我们,当我们不断重复 x 操作的时候,计算⼀定会「死循环」,循环的情况有两种:

  • ⼀直在 1 中死循环,即 1 -> 1 -> 1 -> 1...

  • 在历史的数据中死循环,但始终变不到1

由于上述两种情况只会出现⼀种,因此,只要我们能确定循环是在情况⼀中进⾏,还是在情况⼆中进⾏,就能得到结果。

可能这里就会有人疑问, 是否还有第三种情况, 就是这个数一直在变化, 没有循环?

实则不存在这种情况!

根据"鸽巢原理",⼀个数变化 811 次之后,必然会形成⼀个循环

因此,变化的过程最终会⾛到⼀个圈⾥⾯,因此可以⽤"快慢指针"来解决

算法思路

根据上述的题⽬分析,我们可以知道,当重复执⾏ x 的时候,数据会陷⼊到⼀个"循环"之中。

而"快慢指针"有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的,也就是说他们总会相遇在⼀个位置上。如果相遇位置的值是 1 ,那么这个数⼀定是快乐数;如果相遇位置不是 1 的话,那么就不是快乐数.

Java代码

java 复制代码
class Solution {
    private int bitSum(int n) {
        int sum = 0;
        while(n != 0) {
            int m = n % 10;
            sum += m * m;
            n /= 10;
        }
        return sum;
    }
    public boolean isHappy(int n) {
        int low = n;
        int fast = n;
        //由于一开始把他们都赋值成了n, 所以循环不能直接进, 可以使用do while.
        do {
            low = bitSum(low);
            for (int i = 0; i < 2; i++) {
                fast = bitSum(fast);
            }
        } while (low != fast);
        return low == 1;
    }
}
相关推荐
~|Bernard|8 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师8 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo38 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC9 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
liulilittle10 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx12 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐13 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸13 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
一只懒洋洋14 小时前
K-meas 聚类、KNN算法、决策树、随机森林
算法·决策树·聚类
方案开发PCBA抄板芯片解密15 小时前
什么是算法:高效解决问题的逻辑框架
算法