1.题目
2.知识点
(1)while (seen.contains(n) == false) {
// 循环体
}
与
!seen.contains(n)
等同
(2)
当传入数字 19 给 isHappy(19) 方法时,下面是每一行代码的执行过程:
初始化一个空的 HashSet,命名为 ss,用于存储已经计算过的数字。
声明并初始化 sum 变量为 0,用于存储各位数字的平方和。
进入 while 循环。由于 n 的初始值不等于 1,且 ss 集合中不包含 n,因此循环条件成立,进入循环体。
将当前的数字 n,即 19,添加到集合 ss 中。
调用 GetNext(n) 方法计算 n 的下一个数字。在 GetNext() 方法中,我们首先将 n 的个位数字取出并计算其平方,然后将其相加得到 sum,即 1^2 + 9^2 = 1 + 81 = 82。
将计算得到的 sum 值赋给 n。
继续循环,此时 n 的值为 82。
重复上述步骤,将 82 添加到 ss 集合中,并通过 GetNext() 方法计算下一个数字。在 GetNext() 方法中,计算 82 的各位数字的平方和得到 68,并将其赋给 n。
循环继续执行,此时 n 的值为 68。
重复上述步骤,将 68 添加到 ss 集合中,并通过 GetNext() 方法计算下一个数字。在 GetNext() 方法中,计算 68 的各位数字的平方和得到 100,并将其赋给 n。
循环继续执行,此时 n 的值为 100。
重复上述步骤,将 100 添加到 ss 集合中,并通过 GetNext() 方法计算下一个数字。在 GetNext() 方法中,计算 100 的各位数字的平方和得到 1,并将其赋给 n。
此时,循环继续执行,但是 n 的值已经等于 1,不满足循环条件,退出循环。
返回 n == 1,因为 n 的值为 1,所以返回 true,说明数字 19 是一个快乐数。
这就是对于数字 19 的每一行代码的执行过程。
3.代码实现
import java.util.HashSet;
import java.util.Set;public class Solution {public boolean isHappy(int n) {Set<Integer> ss=new HashSet<>();while(n!=1&&ss.contains(n)==false){//循环判断条件是 当n不等于1的时候继续循环 并且 ss集合里面不能重复出现已出现的数ss.add(n);n=GetNext(n);}return n ==1;}private int GetNext(int n){int sum=0;while(n>0)//当n是正整数的时候{int digit=n%10;//从左到右取每个位的数 sum=sum+digit*digit;//将这个数平方n=n/10;//左移一位,数字缩写10倍//举个例子// int digit=n%10; 19%10=9//sum=81//n=1//1%10=1//sum=1+81=82}return sum;}
}