美文网首页算法
LeetCode题解:快乐数

LeetCode题解:快乐数

作者: 搬码人 | 来源:发表于2022-03-30 20:40 被阅读0次

    题目描述

    编写一个算法来判断一个数n是不是快乐数。
    “快乐数”定义为:

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

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

    示例

    • 示例1
      输入:n = 19
      输出:true
      解释:
      1^2 + 9^2 = 82
      8^2 + 2^2 = 68
      6^2 + 8^2 = 100
      1^2 + 0^2 + 0^2 = 1
    • 示例2
      输入:n = 2
      输出:false

    思路方法

    只需要抓住一点:按快乐数的运算方式,最后得到的数要么是1,要么就在一定范围内无限循环(得不到1)。

    哈希法

    class Solution {
        public int getNext(int n){
            int totalNum = 0;
            while(n!=0){
                int temp=n%10;
                n/=10;
                totalNum+= temp*temp;
            }
            return totalNum;
        }
        public boolean isHappy(int n) {
            Set<Integer> hash = new HashSet<Integer>();
            while(n>1&&!hash.contains(n)){
                hash.add(n);
                n = getNext(n);
            }
            return n==1;
        }
    }
    

    复杂度分析

    • 时间复杂度:O(logn)
    • 空间复杂度:O(logn)

    双指针法

    class Solution {
        public int getNext(int n){
            int totalNum = 0;
            while(n!=0){
                int temp=n%10;
                n/=10;
                totalNum+= temp*temp;
            }
            return totalNum;
        }
        public boolean isHappy(int n) {
            int slow = n;
            int fast = getNext(n);
            while(fast!=1&&fast!=slow){
                slow = getNext(slow);
                fast = getNext(getNext(fast));
            }
            return fast==1;
        }
    }
    

    复杂度分析

    • 时间复杂度:O(logn)
    • 空间复杂度:O(1)

    相关文章

      网友评论

        本文标题:LeetCode题解:快乐数

        本文链接:https://www.haomeiwen.com/subject/ixmwjrtx.html