202. 快乐数https://leetcode.cn/problems/happy-number/
1、题目
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释:![]()
![]()
![]()
![]()
示例 2:
输入:n = 2 输出:false
提示:
1 <= n <=
2、题解
题解1:使用递归
class Solution {// 计算数字 n 各位数字的平方和public Integer getSum(int n) {int sum = 0;while(n != 0) {int m = n % 10; // 获取当前最后一位数字sum = sum + m * m; // 累加平方n = n / 10; // 去除最后一位数字}return sum;}// 判断 n 是否为快乐数public boolean Happy(int n, Set<Integer> allSum) {int sum = getSum(n); // 计算平方和if(sum == 1) { // 快乐数条件return true;} else {if(allSum.contains(sum)) { // 出现重复的平方和,陷入循环return false;} else {allSum.add(sum); // 添加到已出现的平方和集合return Happy(sum, allSum); // 继续递归}}}// 判断数字 n 是否为快乐数public boolean isHappy(int n) {Set<Integer> allSum = new HashSet<Integer>(); // 存储出现的平方和return Happy(n, allSum); // 调用判断方法}
}
题解2:不使用递归
class Solution {// 计算数字 n 各位数字的平方和public Integer getSum(int n) {int sum = 0;while(n != 0) {int m = n % 10; // 获取当前最后一位数字sum = sum + m * m; // 累加平方n = n / 10; // 去除最后一位数字}return sum; // 返回平方和}// 判断数字 n 是否为快乐数public boolean isHappy(int n) {Set<Integer> allSum = new HashSet<Integer>(); // 存储已出现的平方和// 如果 n 不是 1 且没有出现重复的平方和,继续迭代while(n != 1 && !allSum.contains(n)) {allSum.add(n); // 将当前平方和加入集合n = getSum(n); // 获取新的平方和}return n == 1; // 如果最终 n 为 1,说明是快乐数}
}