力扣202(java&python)-快乐数(简单)

题目:

编写一个算法来判断一个数 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

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

快慢指针:创建一个慢指针,每次走一步,再创建一个快指针,每次走两步,当快慢指针相遇时,代表形成了环路,这个数字就不是快乐数【有环的话一定会相遇的原因:快指针每走一步,在他们移动方向上,快指针就会向慢指针靠近一个结点】,如果指针移动过程中,找到了1,则当前是一个快乐数。

举例:n = 116,运用官方图解

1.初始值slow = 116, fast = SquareSum(116)=38;

 2.fast != 1 && slow != fast,继续向前,slow= SquareSum(116)=38,fast=SquareSum(SquareSum(38))=58;

 3.fast != 1 && slow != fast,继续向前,slow= SquareSum(38)=73,fast=SquareSum(SquareSum(58))=145;

 4.fast != 1 && slow != fast,继续向前,slow= SquareSum(73)=58,fast=SquareSum(SquareSum(145))=20;

 5.fast != 1 && slow != fast,继续向前,slow= SquareSum(58)=89,fast=SquareSum(SquareSum(20))=16;

 6.fast != 1 && slow != fast,继续向前,slow= SquareSum(89)=145,fast=SquareSum(SquareSum(16))=58,这时又遇到58,又会继续循环;

7.开始和上一个58一样的循环,fast != 1 && slow != fast,继续向前,slow= SquareSum(145)=42,fast=SquareSum(SquareSum(58))=145;

 8.fast != 1 && slow != fast,继续向前,slow= SquareSum(42)=20,fast=SquareSum(SquareSum(145))=20,这时快慢指针相遇,形成环路,说明116并不是一个快乐数,不会再遇到1;

 java代码:

 1 class Solution {
 2     public int SquareSum(int n){
 3         int sum = 0;
 4         while(n > 0){
 5             int d = n % 10;
 6             sum += d * d;
 7             n /= 10;
 8         }
 9         return sum;
10     }
11 
12     public boolean isHappy(int n) {
13         int slow = n, fast = SquareSum(n);
14         while(fast != 1 && slow != fast){
15             slow = SquareSum(slow);
16             fast = SquareSum(SquareSum(fast));
17         }
18         return fast == 1;   
19     }
20 }

 python3代码:

 1 class Solution:
 2     def isHappy(self, n: int) -> bool:
 3         def SquareSum(n):
 4             sum = 0
 5             while n > 0:
 6                 d = n % 10
 7                 sum += d * d
 8                 n //= 10
 9             return sum
10 
11         slow = n
12         fast = SquareSum(n)
13         while fast != 1 and slow != fast:
14             slow = SquareSum(slow)
15             fast = SquareSum(SquareSum(fast))
16         return fast == 1

2023-05-09:

哈希表:

 1 class Solution {
 2     public boolean isHappy(int n) {
 3         HashSet<Integer> set = new HashSet<>();
 4         while (n != 1 && !set.contains(n)){
 5             set.add(n);
 6             n = getnext(n);
 7         }
 8         return n == 1;
 9     }
10     public int getnext(int n){
11         int res = 0;
12         while (n != 0){
13             int temp = n % 10;
14             res += temp * temp;
15             n /= 10;
16         }
17         return res;
18     }
19 }
posted on 2022-09-29 11:43  我不想一直当菜鸟  阅读(130)  评论(0编辑  收藏  举报