1 题目地址
202. 快乐数 - 力扣(LeetCode)202. 快乐数 - 编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为: * 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 * 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 * 如果这个过程 结果为 1,那么这个数就是快乐数。如果 n 是 快乐数 就返回 true ;不是,则返回 false 。 示例 1:输入:n = 19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1示例 2:输入:n = 2输出:false 提示: * 1 <= n <= 231 - 1
https://leetcode.cn/problems/happy-number/description/
2 题目说明
编写一个算法来判断一个数
n
是不是快乐数。「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果
n
是 快乐数 就返回true
;不是,则返回false
。
示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1示例 2:
输入:n = 2 输出:false
提示:
1 <= n <= 231 - 1
3 解题思路
1、整数类型拆解 比如:整数789拆分成 7 8 9
实现方案: 789 / 10 = 78 789%10 = 9
78 / 10 = 7 78 % 10 = 8
7 / 10 = 0 7 % 10 = 7
将整数对10取余,得到整数的组成数字,比如9
将整数对10相除,得到下一次进行取余的数据(去掉已经获得的组成数据);
比如整数789,按照这种方式依次获取的数据是9 8 7 倒序的方式
public List<Integer> getNumberPart(int n) {
List<Integer> partList = new ArrayList<>();
while (n!=0) {
// 整数的组成部分
int part = n % 10;
// 用于下次获取整数的部分
n = n / 10;
partList.add(part);
}
// 方式一: 倒序输出
for (int i=partList.size()-1; i>=0; i--) {
System.out.print(partList.get(i) + " ");
}
// 方式二:直接倒序
Collections.reverse(partList);
return partList;
}
2、题干中表示可能会无限循环,也就是说在求和的过程中,sum会重复出现,这块就需要将已经出现的数据存储下来,如果下次处理中发现又出现了,可以直接退出。
4 代码编写
class Solution {
public boolean isHappy(int n) {
// 存放历史数据
HashSet<Integer> record = new HashSet<>();
// 等于1或者产生了循环则退出,否则继续
while (!record.contains(n) && n!=1) {
record.add(n);
n = getNumber(n);
}
return n==1;
}
// 整数n,组成数据的平方的和,比如n=78 , result = 7*7+8*8
public int getNumber(int n) {
int result = 0;
while (n!=0) {
int part = n % 10;
result += part * part;
n = n / 10;
}
return result;
}
}