17-算法打卡-哈希表-快乐数-leetcode(202)-第十七天
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*8public int getNumber(int n) {int result = 0;while (n!=0) {int part = n % 10; result += part * part;n = n / 10;}return result;}}