LeetCode202.快乐数

202.快乐数

编写一个算法来定义一个数n是不是快乐数

快乐数定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和
  • 然后重复这个过程直到这个数变为1,也可能是无限循环,但始终变不到1
  • 如果这个过程结果为1,那么这个数就是快乐数

如果n是快乐数,就返回true,否则返回false

LeetCode202.快乐数_第1张图片

这道题目,首先我们应该搞明白,如何求一个自然数的各个位数的累加和

比如:此时n=19,怎么拿到12+92=82的?

很简单,我们使用一个while循环,循环的条件是,n>0

我们用一个res整型变量来记录这个求和过程

我们对n进行取模(取模10),即19%10 = 9

此时已经计算过个位数字了,将n除以10,即n/10 =1 ,就可以拿到下一位数字

我们对这两个数进行平方累加和即可

int res = 0;
while(n>0){
	int temp = n%10; //temp=19%10=9 temp=1%10=1
	res+=temp*tmep;  //res += 9*9;  res +=1*1
	n = n/10;		//n=1 n=0
}
return res;  //res = 9*9+1*1 = 81+1 = 82;

但是这道题的一个关键点在于,在我们计算的过程中,可能会出现重复的循环数字,也就是,可能永远求不到底

这个时候,就需要我们使用Set集合来对每一次求得的res进行统计

以便排除重复的情况

    public boolean isHappy(int n) {
        //设置一个set,检查是否出现循环数字
        Set<Integer> set = new HashSet();
        //n不为1,且集合中没有出现重复数字
        while(n!=1&&!set.contains(n)){
            //将当前计算出来的结果n放入到集合中
            set.add(n);
            //然后再次进行调用,计算下一个n
            n = getNextNumber(n);
        }
        //返回的结果,如果n=1,则返回true,否则,返回false
        return n==1;
    }
    //取模累加求和过程
    public int getNextNumber(int n){
        int res=0;
        while(n>0){
            int temp = n%10;
            res+=temp*temp;
            n = n/10;
        }
        return res;
    }

你可能感兴趣的:(算法实战,leetcode,算法,数据结构,力扣,哈希表,java)