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*8
    public int getNumber(int n) {
        int result = 0;
        while (n!=0) {
            int part = n % 10; 
            result += part * part;
            n = n / 10;
        }
        return result;
    }
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值