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

(笔记自用)LeetCode:快乐数

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

2.题目分析

快乐数的定义是基于一个计算过程,即对一个正整数,不断将其替换为它各个位上数字的平方和,如果最终这个过程能够收敛到1,则这个数被称为快乐数。相反,如果在这个过程中形成了一个不包含1的循环,则该数不是快乐数。对于非快乐数,它们的平方和序列会进入一个固定的循环,例如4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4。

为了证明每个循环的数字都是一样的,我们可以使用数学中的不动点理论。在一个有限的系统中,重复应用一个确定的操作最终会达到一个循环,这是因为系统的状态是有限的。在快乐数的情况下,由于每次计算都是基于有限的数字(0-9)的平方,因此可能的结果也是有限的。这意味着,如果我们从某个数字开始,不断重复计算它的各位数字的平方和,最终必然会进入一个循环,因为可能的平方和是有限的,而且每次计算都是确定性的。

此外,由于每个非快乐数都会进入一个固定的循环,而这个循环不包含1,这意味着循环中的所有数字都是固定的,并且每次遇到同一个数字时,都会得到相同的下一个数字。这就是为什么每个循环的数字都是一样的。

综上所述,我们可以得出结论,对于非快乐数,它们在重复计算各位数字的平方和的过程中不仅会形成一个循环,而且每个循环中的数字都是一样的。这一结论是基于有限性原理和确定性操作的重复应用。

因此我们可以使用哈希表和快慢指针来解决问题。

注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。

3.题解

1.哈希表法

int getSum(int n) 
{int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;
}bool isHappy(int n){int sum = getSum(n);int hash[820] = {0};//核心思想:若某个数字重复出现了,则这个数字永远不可能会等于1while (sum != 1) {if (hash[sum] == 1) return false;else hash[sum]++;sum = getSum(sum);}return true;
}

2.快慢指针

int getSum(int n) 
{int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;
}bool isHappy(int n){int slow = getSum(n);       //慢指针走一步int fast = getSum(slow);    //快指针走两步while(1){if( slow==1 || fast==1 )return true;if(slow == fast)return false;slow=getSum(slow);  //走一步fast=getSum(getSum(fast));  //走两步}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Elasticsearch】-图片向量化存储
  • 网络原理之IP协议(网络层)
  • 如何查看线程
  • 【STM32系统】基于STM32设计的DAC输出电压与ADC检测电压系统(简易万用表,检测电压电流)——文末工程资料下载
  • Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解
  • Linux Shell: 使用 Expect 自动化 SCP 和 SSH 连接的 Shell 脚本详解
  • 【Java】注解与单元测试的使用【主线学习笔记】
  • MySQL高阶1965-丢失信息的雇员
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
  • MICS:PythonJail沙箱逃逸(持续更新中)
  • 初识C#(二)- 流程控制
  • 模拟自然的本质:与IBM量子计算研究的问答
  • Redis存储原理
  • 3、等保1.0 与 2.0 的区别
  • Mac强制停止应用
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [case10]使用RSQL实现端到端的动态查询
  • 【面试系列】之二:关于js原型
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • django开发-定时任务的使用
  • Electron入门介绍
  • Git 使用集
  • JS专题之继承
  • MySQL数据库运维之数据恢复
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Solarized Scheme
  • VUE es6技巧写法(持续更新中~~~)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 当SetTimeout遇到了字符串
  • 利用jquery编写加法运算验证码
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 你真的知道 == 和 equals 的区别吗?
  • 深度学习中的信息论知识详解
  • 我这样减少了26.5M Java内存!
  • 项目管理碎碎念系列之一:干系人管理
  • 学习HTTP相关知识笔记
  • 在weex里面使用chart图表
  • UI设计初学者应该如何入门?
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​Java基础复习笔记 第16章:网络编程
  • $.ajax中的eval及dataType
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (2.2w字)前端单元测试之Jest详解篇
  • (C11) 泛型表达式
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (第一天)包装对象、作用域、创建对象
  • (附源码)计算机毕业设计SSM疫情社区管理系统