Leetcode:202. 快乐数

Leetcode:202. 快乐数

题目描述

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

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

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

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

思路

思路1 递推+哈希表记录

使用一个哈希表依次记录10进制各个位的平方和,最后判断最后输入的值是否为1

思路2 递推+快慢指针

递推下一个数是一样的,可以通过快慢指针的方式判断是否是快乐数

代码

代码1

class Solution {
    public boolean isHappy(int n) {
        if (n <= 0){
            return false;
        }
        Set intSet = new HashSet();
        while (n != 1 && !intSet.contains(n)){
            intSet.add(n);
            n = getHappy(n);
        }
        return n == 1;
    }
    
    private int getHappy(int n){
        int result = 0;
        int tempNum = 0;
        while (n != 0){
            tempNum = n % 10;
            result += tempNum * tempNum;
            n /= 10;
        }
        return result;
    }
}

代码2

class Solution {
    public boolean isHappy(int n) {
        if (n <= 0){
            return false;
        }
        int fast = getHappy(n);
        int slow = n;
        while (fast != 1 && slow != fast){
            fast = getHappy(getHappy(fast));
            slow = getHappy(slow);
        }
        return fast == 1;
    }
    
    private int getHappy(int n){
        int result = 0;
        int tempNum = 0;
        while (n != 0){
            tempNum = n % 10;
            result += tempNum * tempNum;
            n /= 10;
        }
        return result;
    }
}

复杂度分析

思路1时间复杂度

$O(logn)$

思路1空间复杂度

$O(logn)$

思路2时间复杂度

$O(logn)$

思路2空间复杂度

$O(1)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:371. 两整数之和 Leetcode:371. 两整数之和
[Leetcode: 371. 两整数之和]题目描述不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。 示例 1:输入: a = 1, b = 2 输出: 3 示例 2:输入: a = -
2020-05-08
下一篇 
Leetcode:326. 3的幂 Leetcode:326. 3的幂
Leetcode:326. 3的幂题目描述给定一个整数,写一个函数来判断它是否是 3 的幂次方。 示例 1:输入: 27 输出: true 示例 2:输入: 0 输出: false 示例 3:输入: 9 输出: true 示例 4:
2020-05-07
  目录