当前位置: 首页 > article >正文

力扣: 快乐数

文章目录

  • 需求
  • 分析
  • 代码
  • 结尾

在这里插入图片描述


需求

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


分析

取该数字的每一位上的数字,平方后求和。
将得到的结果作为新的数字,重复上述步骤。
如果最终结果是1,则该数字是快乐数字;如果出现了循环(即进入了一个已经出现过的数字),则该数字不是快乐数字。


代码

public boolean isHappy(int n) {
    Set<Integer> set = new HashSet();
    while( true ){
        n = getSum(n);
        if( n == 1 ){
            return true;
        }
        if( !set.add(n) ){
            return false;
        }
    }
}

private int getSum(int n){
    int sum = 0;
    while( n > 0 ){
        int temp = n % 10;
        sum += temp * temp;
        n = n / 10;
    }
    return sum;
}

代码解释:

这是主方法,接收一个整数 n,判断它是否为快乐数字。
Set<Integer> set = new HashSet();

创建一个 HashSet 用于存储已经出现过的数字。这个集合帮助我们检测是否进入了循环。

无限循环,直到找到结果(是快乐数字还是进入循环)。
n = getSum(n);

调用 getSum 方法计算 n 的每一位的平方和,并将结果赋值给 n。
if (n == 1) { return true; }

如果计算结果为1,则返回 true,说明 n 是一个快乐数字。
if (!set.add(n)) { return false; }

尝试将 n 添加到 set 中。如果添加失败(即 set 中已经存在这个数字),说明 n 进入了循环,返回 false,说明 n 不是快乐数字。

结束 while 循环。

辅助方法getSum:

这是一个私有方法,用于计算数字 n 各位数字的平方和。
int sum = 0;

初始化 sum 为0,用于累加每一位数字的平方和。
while (n > 0) {

只要 n 大于0,就继续计算。
int temp = n % 10;

取 n 的最后一位数字。
sum += temp * temp;

将该位数字的平方累加到 sum 中。
n = n / 10;

去掉 n 的最后一位数字。

结束 while 循环。
return sum;

返回计算得到的平方和。


运行结果:

在这里插入图片描述

结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答…






http://www.kler.cn/a/300167.html

相关文章:

  • Linux内核编程(二十一)USB驱动开发-键盘驱动
  • Java Web开发高级——单元测试与集成测试
  • 路径规划之启发式算法之二十八:候鸟优化算法(Migrating Birds Optimization, MBO)
  • 程序员不可能不知道的常见锁策略
  • Flask简介与安装以及实现一个糕点店的简单流程
  • 讯飞星火大模型将超越chatgpt?
  • 推理与训练,分布式训练
  • FFmpega安装教程
  • 华为云低代码AstroZero技巧教学4:花瓣图展示 给数据加点色彩
  • Android中如何实现adb向应用发送特定指令并接收返回
  • 计算机网络基础概念 交换机、路由器、网关、TBOX
  • 【区块链通用服务平台及组件】基于向量数据库与 LLM 的智能合约 Copilot
  • 数据结构应用实例(三)——赫夫曼编码
  • linux系统之基础io
  • 【Android】SurfaceFlinger Dumpsys信息分析
  • HarmonyOS 开发范式、应用模型
  • CSS学习12--清除浮动的本质及处理办法
  • 杂谈|压力管理之「压力」影响(二)
  • 2. 变量和指令(omron 机器自动化控制器)——2
  • 三种方式可以将彩色图像转成灰度图对比
  • 使用API有效率地管理Dynadot域名,查看某一订单当前的状态
  • 需要恢复 Android 手机的存储卡?6 个Android 数据恢复应用程序(可用于手机内存 + MicroSD 卡)
  • 【银河麒麟高级服务器操作系统】虚拟机服务器执行systemctl提示timeout——分析全过程及处理建议
  • [数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别
  • 基于MinerU的PDF解析API
  • 面试必问的7大测试分类!一文说清楚!