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

LeetCode每日一题之 快乐数

目录

题目介绍: 

 算法原理:

鸽巢原理:

如何找到环里元素:

代码实现:


题目介绍: 

题目链接:. - 力扣(LeetCode)

 算法原理:

我先简单举两个例子:

19: 

2:

  其实大部分人拿到这道题,第一感觉就是如果是快乐数,只需利用循环一步步求解,最后如果有一次结果为1时,就是快乐数,可是如果不是快乐数,岂不是要一直循环下去?这道题最重要的一点就是如果不是快乐数最后的数据是必定成环的,证明需要利用鸽巢原理:

鸽巢原理:

如果有n个巢穴,n+1只鸽子,那么必定会有一个巢血有2个或以上的鸽子。

这个原理很简单,我们利用它来证明一下这道题若不是快乐数必定成环:

利用极限法:

来看看这道题数据的最大值2的31次方=2147483648,不妨再去大点直接取9999999999,我们看看这个数经历一次变化(替换为该数每一位的平方和)后会变成多少,也就是9*9*10=810,这个最大的数经历一次变化后变为810,那么比这个数小的数经历一次变化肯定不会大于810,所以我们的巢就是1-810,也就是有810个巢,那我们的鸽子就是变化的次数,一个数若变化811次,则至少有2个数是重复的,重复的一出现,后面就全一样了,就成环了。


 那如果是快乐数,是不是就没有环呢?其实也有,快乐数最后变为1后,若再经历一次变化还是1,其实也成环了,只是环里的元素都是1,而不是快乐数环里的元素都不是1,所以这道题目的思路很清晰了,我们只要找到一个环里元素判断是不是1就行了。

如何找到环里元素:

  面对这种环的问题,我们可以利用双指针里的快慢指针法就可以求解了,如图:

slow慢指针一次走一步,fast快指针一次走两步。

还没进环之前,slow永远无法追上fast指针,但当进环后,就像两个人在圆形跑道比赛,只要两人有速度差(速度不一样),就绝对会相遇。 只要以相遇,判断相遇时的元素是否为1就行。

代码实现:

class Solution {
public:int compute(int n)//计算n每个位上的平方和{int sum=0;while(n){int tmp = n%10;sum+=tmp*tmp;n/=10;}return sum;}bool isHappy(int n) {int slow =n,fast=compute(n);//初始fast在slow前一个while(slow!=fast){slow=compute(slow);//slow一次走一步fast=compute(compute(fast));//fast一次走两步}return fast==1;//相遇时fast或者slow等于1就是快乐数}
};

相关文章:

  • Rust常用特型之Drop特型
  • 【Python】科研代码学习:六 ModelOutput,SpecificModel
  • Rust有没有信号量机制,在缓存有数据的时候才允许等待的进程取数据?
  • 【Go】令牌桶限流算法
  • Unity Text文本实现滚动跑马灯效果
  • (MATLAB)第五章-矩阵运算
  • okHttp MediaType MIME格式详解
  • Java的堆如何分代的?
  • 吴恩达机器学习笔记十六 如何debug一个学习算法 模型评估 模型选择和训练 交叉验证测试集
  • SpringCloudGateway理论与实践
  • 【docker基础学习之】镜像构建
  • VLAN FAQ
  • WiFi模块助力少儿编程:创新学习与实践体验
  • 【kvm企业级虚拟化】之初级篇
  • uniapp直接连接wifi(含有ios和安卓的注意事项)
  • 时间复杂度分析经典问题——最大子序列和
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 4. 路由到控制器 - Laravel从零开始教程
  • android图片蒙层
  • co.js - 让异步代码同步化
  • css选择器
  • C语言笔记(第一章:C语言编程)
  • eclipse的离线汉化
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Intervention/image 图片处理扩展包的安装和使用
  • Java多态
  • jdbc就是这么简单
  • MySQL-事务管理(基础)
  • nodejs调试方法
  • October CMS - 快速入门 9 Images And Galleries
  • Vue组件定义
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 聊聊flink的TableFactory
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 思考 CSS 架构
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 智能网联汽车信息安全
  • Hibernate主键生成策略及选择
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #QT项目实战(天气预报)
  • $$$$GB2312-80区位编码表$$$$
  • (13)Hive调优——动态分区导致的小文件问题
  • (2020)Java后端开发----(面试题和笔试题)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)人的集合论——移山之道
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net framework4与其client profile版本的区别
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 材料检测系统崩溃分析
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...