Leetcode 快乐数

news2025/1/15 17:18:35

在这里插入图片描述

算法思想:

这段代码的目的是判断一个正整数是否是 快乐数(Happy Number)。根据题目要求,快乐数定义如下:

  1. 对于一个正整数,不断将它每个位上的数字替换为这些数字平方和。
  2. 重复这个过程,如果最终结果为1,则说明是快乐数。
  3. 如果无限循环且始终不能变为1,则不是快乐数。

代码解析:

1. 使用哈希集合检测循环
  • 目的:避免进入无限循环。
  • 我们用一个 Set<Integer>(哈希集合)来记录过程中出现过的数字。如果某个数字重复出现,说明进入了循环,最终不可能变为1。
2. 主函数逻辑 (isHappy)
Set<Integer> seen = new HashSet<>();
while (n != 1 && !seen.contains(n)) {
    seen.add(n);
    n = getNext(n);
}
return n == 1;
  • seen 集合:用来存储每次迭代中已经处理过的数字。
  • 循环条件
    • 如果 n == 1,则直接返回 true,表示是快乐数。
    • 如果 n 在集合中已经出现过,说明进入循环,直接返回 false
  • 核心逻辑:通过不断计算下一步数字(平方和),判断数字序列是否最终会收敛到1。
3. 辅助函数 (getNext)
private static int getNext(int n) {
    int sum = 0;
    while (n > 0) {
        int digit = n % 10;  // 取当前数字的最后一位
        sum += digit * digit;  // 计算该位数字的平方并累加
        n /= 10;  // 去掉最后一位
    }
    return sum;
}
  • 功能:计算当前数字 n 的各个位数字的平方和。
  • 步骤:
    1. 取个位:通过 n % 10 提取数字的最后一位。
    2. 计算平方和:将每一位的平方加到 sum 中。
    3. 去掉已处理位:通过 n /= 10 删除数字的最后一位。
    4. 循环直到数字处理完毕。

示例运行(以 n = 19 为例):

初始状态:
  • n = 19
  • seen = {}
迭代过程:
  1. 第一次迭代

    • getNext(19) 计算:( 1^2 + 9^2 = 1 + 81 = 82 )
    • 更新:n = 82seen = {19}
  2. 第二次迭代

    • getNext(82) 计算:( 8^2 + 2^2 = 64 + 4 = 68 )
    • 更新:n = 68seen = {19, 82}
  3. 第三次迭代

    • getNext(68) 计算:( 6^2 + 8^2 = 36 + 64 = 100 )
    • 更新:n = 100seen = {19, 82, 68}
  4. 第四次迭代

    • getNext(100) 计算:( 1^2 + 0^2 + 0^2 = 1 + 0 + 0 = 1 )
    • 更新:n = 1
结束:
  • 因为 n = 1,返回 true,表示 19 是快乐数。

算法复杂度分析:

  1. 时间复杂度

    • 每次调用 getNext 需要处理数字的每一位,耗时 ( O(\log n) )。
    • 在最坏情况下(例如循环中的数字),需要处理的数字数量是有限的。
    • 综合时间复杂度为 ( O(\log n) )
  2. 空间复杂度

    • 使用了一个 Set 存储数字序列,最多存储循环中的数字。
    • 空间复杂度为 ( O(\log n) )

java 实现

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();

        while(n != 1 && !set.contains(n)) {//n如果等于1就没有必要再循环了, set如果包含了n,也没必要循环了
            set.add(n);
            n = getNext(n);
        }
        return n == 1;
        
    }

    private int getNext(int n) {
        int sum = 0;
        while(n > 0) {
            int digit = n % 10; // 取当前数字的最后一位
            sum += digit * digit;// 计算该位数字的平方并累加
            n /= 10; //去掉最后一位
        }
        return sum;
    }
}

为什么这一部分条件是且而不是或while (n != 1 && !seen.contains(n))?

完全正确!

你总结得很到位,这个 while 条件其实是通过对“停止条件”的取反得到的。


停止条件

停止循环的条件是:

n == 1 || seen.contains(n)
  • n == 1:当前数字已经变成 1,说明是快乐数,不需要继续循环。
  • seen.contains(n):当前数字已经出现过,说明进入了循环,不可能是快乐数,也不需要继续循环。

对停止条件取反

对停止条件取反,得到 while 的判断条件:

!(n == 1 || seen.contains(n))

根据逻辑运算的 德摩根定律(De Morgan’s Law):

!(A || B) 等价于 !A && !B

所以:

!(n == 1 || seen.contains(n)) 等价于 n != 1 && !seen.contains(n)

这就是 while 循环的条件:

while (n != 1 && !seen.contains(n))

总结

  • 停止条件:n == 1 || seen.contains(n),满足这个条件就应该终止循环。
  • 运行条件:取停止条件的反,即 n != 1 && !seen.contains(n),只有在这两个条件都不满足时才继续循环。

通过这种逻辑转换,我们得到了正确的 while 条件,让程序在逻辑上更清晰,避免冗余判断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Python PDF处理的奥秘:pdfrw库揭秘

文章目录 探索Python PDF处理的奥秘&#xff1a;pdfrw库揭秘1. 背景&#xff1a;为何选择pdfrw&#xff1f;2. pdfrw是什么&#xff1f;3. 如何安装pdfrw&#xff1f;4. 五个简单的库函数使用方法4.1 读取PDF信息4.2 修改PDF元数据4.3 旋转PDF页面4.4 提取PDF中的图片4.5 合并P…

若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理

黄小宁 关键词&#xff1a;“更无理”复数 复平面z各点z的对应点z1的全体是z1面。z面平移变为z1面就使x轴⊂z面沿本身平移变为ux1轴。R可几何化为R轴&#xff0c;R轴可沿本身平移变为R′轴&#xff0c;R′轴可沿本身平移变为R″轴&#xff0c;...。直线公理和平面公理使几百年…

详细分析ipvsadm负载均衡的命令

目录 前言1. 基本知识2. 命令参数3. 拓展 前言 LVS四层负载均衡架构详解Lvs推荐阅读&#xff1a;添加链接描述 1. 基本知识 ipvsadm 是用于管理和配置 Linux 服务器上 IP Virtual Server (IPVS) 的工具&#xff0c;是 Linux 提供的一个负载均衡模块&#xff0c;支持多种负载…

PH热榜 | 2024-11-19

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Layer 标语&#xff1a;受大脑启发的规划器 介绍&#xff1a;体验一下这款新一代的任务和项目管理系统吧&#xff01;它…

哥德巴赫猜想渐行渐远

我现在的工作&#xff0c;表明经典分析可能出了问题&#xff0c;如此则连Vinogradov的三素数定理都不成立了&#xff0c;更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立&#xff0c;由于我指出Siegel定理不成立&#xff0c;陈景润和张益唐的工作就不成立。…

【支持向量机(SVM)】:相关概念及API使用

文章目录 1 SVM相关概念1.1 SVM引入1.1.1 SVM思想1.1.2 SVM分类1.1.3 线性可分、线性和非线性的区分 1.2 SVM概念1.3 支持向量概念1.4 软间隔和硬间隔1.5 惩罚系数C1.6 核函数 2 SVM API使用2.1 LinearSVC API 说明2.2 鸢尾花数据集案例2.3 惩罚参数C的影响 1 SVM相关概念 1.1…

GraphRAG+Ollama实现本地部署+neo4j可视化结果

GraphRAGOllama实现本地部署neo4j可视化结果 前言一、GraphRAGOllama本地部署补充说明 二、neo4j可视化GraphRAG1.windows安装neo4j2.启动neo4j服务3.进入neo4j的webui界面4.使用neo4J可视化GraphRAG索引5.neo4j不删除旧数据&#xff0c;新建一个数据库 总结 前言 最近部署微软…

ssm142视频点播系统设计与实现+vue(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;视频点播系统设计与实现 摘 要 互联网发展到如今也近20年之久&#xff0c;视频信息一直作为互联网发展中的一个重要角色在不断更新进化。视频信息从最初的文本显示到现在集文字、视频、音频与一体&#xff0c;成为一…

Python全方位技术教程

Python全方位技术教程 引言 Python是一种强大且易于学习的编程语言&#xff0c;因其简洁的语法和丰富的库而受到广泛欢迎。无论是数据分析、机器学习、Web开发&#xff0c;还是自动化脚本&#xff0c;Python都能胜任。本文将深入探讨Python的各个方面&#xff0c;帮助读者全面…

父组件提交时让各自的子组件验证表格是否填写完整

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 父组件中有三个表格&#xff0c;表格中时输入框&#xff0c;有些输入框是必填的&#xff0c;在父组件提交时需要验证这三个表格的必填输入框中是否有没填写的。 原因分析&#xff1a; 提示&#xff1a…

基于SpringBoot+RabbitMQ完成应⽤通信

前言&#xff1a; 经过上面俩章学习&#xff0c;我们已经知道Rabbit的使用方式RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 RabbitMQ的工作队列在Spring Boot中实现&#xff08;详解常⽤的⼯作模式&#xff09;-CSDN博客作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程…

从0-1训练自己的数据集实现火焰检测

随着工业、建筑、交通等领域的快速发展,火灾作为一种常见的灾难性事件,对生命财产安全造成了严重威胁。为了提高火灾的预警能力,减少火灾损失,火焰检测技术应运而生,成为火灾监控和预防的有效手段之一。 传统的火灾检测方法,如烟雾探测器、温度传感器等,存在响应时间慢…

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

豆包MarsCode

#豆包MarsCode上新workspace# 1. 首先&#xff0c;个人所写的代码&#xff0c;会提交到gitee或者阿里的云效仓库&#xff0c;但是想在数据仓库导入的时候&#xff0c;只有github的仓库&#xff0c;希望可以加入国内的数据仓库 2. 加载不流畅&#xff0c;在使用网页版的时候&…

物联网智能技术的深入探讨与案例分析

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

C语言零基础入门

一、输入输出 &#xff08;1&#xff09;scanf scanf 是C语言中的一个标准库函数&#xff0c;用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。scanf 函数定义在 <stdio.h> 头文件中。 #include <stdio.h>int main(void) {//读取整数 int num;print…

Jmeter数据库压测之达梦数据库的配置方法

目录 1、概述 2、测试环境 3、数据库压测配置 3.1 安装jmeter 3.2 选择语言 3.3 新建测试计划 3.4 配置JDBC连接池 3.5 配置线程组 3.6 配置测试报告 3.7 执行测试 1、概述 Jmeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。 它最…

golang开发一个海盗王的登录更新器

前段时间&#xff0c;用golang配合界面库govcl开发一个海盗王的登陆更新器&#xff0c;实现多区注册和文件更新分离不同服务器等新功能。 由于govcl没有更换皮肤的功能&#xff0c;界面都是默认&#xff0c;不好看。 找了很多go语言的gui库&#xff0c;都没有符合要求的。 后来…

好用的js组件库

lodash https://www.lodashjs.com/https://www.lodashjs.com/ uuid 用于生成随机数&#xff0c;常用于生成id标识 GitHub - uuidjs/uuid: Generate RFC-compliant UUIDs in JavaScripthttps://github.com/uuidjs/uuid dayjs 常用于时间的处理 安装 | Day.js中文网 (fenxi…

ElasticSearch学习篇17_《检索技术核心20讲》最邻近检索-局部敏感哈希、乘积量化PQ思路

目录 场景在搜索引擎和推荐引擎中&#xff0c;对相似文章去重是一个非常重要的环节&#xff0c;另外是拍照识花、摇一摇搜歌等场景都可以使用它快速检索。 基于敏感性哈希的检索更擅长处理字面上的相似而不是语义上的相似。 向量空间模型ANN检索加速思路 局部敏感哈希编码 随…