编写一个算法来判断一个数
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
java 实现及思路
package com.java.leetcode.hash;
import java.util.HashSet;
import java.util.Set;
/**
* 题目描述
* 编写一个算法来判断一个数 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编写一个算法来判断一个数 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
*/
public class isHappy202 {
public static boolean solution(int n){
// 根据快乐数的定义 是各个位数字的和
// 有可能出现无限循环,因此 需要用hash结构存储 hash 结构 如果存在重复数据则返回false;
Set<Integer> set=new HashSet<>();
if(n==1){
return true;
}
int sum=0;
while(true){
int tmp=n;
//加和的值
while (tmp>0){
int t=tmp%10;
sum+=t*t;
tmp=tmp/10;
}
if(sum==1){
return true;
}else if(set.contains(sum)){
return false;
}else{
set.add(n);
}
n=sum;
sum=0;
}
}
public static void main(String[] args) {
int num=19;
isHappy202.solution(19);
}
}