【问题描述】
编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。示例:输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
【解答思路】
1. HashSet
时间复杂度:O(N^2) 空间复杂度:O(1)
public boolean isHappy(int n) {HashSet set= new HashSet();while(n!=1){n = powSum(n);if(set.contains(n)){return false;}else{set.add(n);}} return true;}//计算平方和int powSum(int n){int sum = 0 ;while(n!=0){sum += Math.pow(n%10,2);n /= 10 ; }return sum;}
2. 快慢指针
时间复杂度:O(N) 空间复杂度:O(1)
public class Solution {public int squareSum(int n) {int sum = 0;while(n > 0){int digit = n % 10;sum += digit * digit;n /= 10;}return sum;}public boolean isHappy(int n) {int slow = n, fast = squareSum(n);// 当是快乐数的时候 while (slow != fast){slow = squareSum(slow);fast = squareSum(squareSum(fast));};return slow == 1;}
}
【总结】
1. 历经一个半月 终于不看题解 一次AC 不愧为快乐数 再接再厉
2. 快慢指针的思想需要掌握
3. HashSet
(1)增加
public boolean add(E e);
(2)删除
public boolean remove(Object j);
(3)对比查找
public boolean contains(Object j);
(4)清空集合
public void clear();
(5)获取长度
public int size();
参考链接:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-de-zhi-shi-dian-zeng-jia-liao-by-sweetiee/
参考链接:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-shu-by-leetcode-solution/