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



















