leetcode 202. 快乐数

编写一个算法来判断一个数 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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值