力扣 - 快乐数

题目描述

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:

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

示例 1:

输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例 2:

输入:n = 2
输出:false

提示:

1 <= n <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/happy-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1- 借助哈希法

根据题目定义说明,
需要定义sum来保存 各个位数的平方之和
可能会 无限循环,也有可能为 1
即:sum ==1时,返回true;
sum !=1 时,无线循环;
那何时返回false呢??—当sum值出现重复时,肯定会陷入无限循环

快速判断一个元素是否出现在集合中 –-哈希法

class Solution {

     public int getSum(int n){
            int sum = 0;
            while (n > 0){
                sum += (n%10)*(n%10);
                n = n/10;
            }
            return sum;
        }

    public boolean isHappy(int n) {

        HashSet<Integer> sumSet = new HashSet();
        int sum = 0;

        while (sum != 1)
        {
           sum = getSum(n);

            if(sumSet.contains(sum)){
                return false;
            }else{
                sumSet.add(sum);
            }
            n = sum;
        }
        return true;
        
        
    }
}

解法2–快慢指针

思路分析:

根据每次调用getSum()得到的值可以构成一个隐式链表。

那么该题就转换成,判断链表是否有环–>弗洛伊德循环算法。龟兔赛跑。
有环 --不是快乐数;
否则 – 是快乐数;
监控两个值,借用快慢指针来求解该题

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页