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;
}
}