202 快乐数问题
https://leetcode.cn/problems/happy-number/
编写一个算法来判断一个数
n
是不是快乐数。「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果
n
是 快乐数 就返回true
;不是,则返回false
。
虽然题目说的是判断快乐数,且归为简单类题目档,但实则一点都不快乐,且题目中指明可能出现无限循环的情况因此还是比较吓唬人的。正向来思考解决的话容易出现死胡同,因此采用逆向解决的方法。
- 本题只会出现两种情况即非快乐数陷入无限循环,快乐数最终结果变为1
- 如果出现重复的计算结果即陷入无限循环,立马判断为非快乐数,否则则为快乐数。
在以上思绪理清楚之后,下面就是设计代码,总的来说有以下功能:
1.对n的每个位置进行平方求和计算得到sum
2 对sum进行快速判断是否出现过,若出现过则直接返回false
有以上思路后,且需进行快速存取问题,边联想到hash结构,且可采用set
import java.util.HashSet;
import java.util.Set;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
//1.计算每一位的平方和
public int getSum(int n){
int sum = 0;
while (n > 0){
sum += Math.pow((n % 10), 2);
n /= 10;
}
return sum;
}
//因为正向求解比较困难,且存在无限循环的原因只有一个 ==> sum值重复出现,因此抓住这点进行求解
public boolean isHappy(int n) {
HashSet<Integer> sumSet = new HashSet<>();
//sumSet.add(n);
//抓住无限循环,已经出现过的
while (n != 1){
n = getSum(n);
if (sumSet.contains(n))
return false;
else
sumSet.add(n);
}
return true;
}
}