双指针算法专题----快乐数以及内部成环条件判断

题目解析及算法原理

有题目可知判定快乐数的条件是循环过程中成环,那我们就可以直接按所给例子(这里省去了按各位数相加的操作)画图:

根据是快乐数所画出来的图可以看得出这个结构与链表非常相似,那么这时候就可以使用双指针算法,将数和算出来的数当作指针,借用成环的结构,那就可以构造出两个快慢指针相追的场景.

实现步骤:

记每次计算数的每一位的平方和的操作为F

1.定义快慢双指针,初始值:慢指针为给定数,快指针为给定数执行一次F的数

2.借助循环构造追赶的操作,快指针走两步(执行两次F操作),慢指针走一步(执行一次F操作)

3.跳出循环,判断相遇时的任意指针的数值

代码实现:

拓展:

读者有没有想过,如果题目中没有给出成环的提示,那么会不会一直就不会成环,接下来我就给大家证明一下为什么链表一定会成环?

数学知识补充:

鸽巢原理(又称抽屉原理):有n个巢,有n+1个鸽子--->至少有一个巢的鸽子数大于1

题目中还有一个提示:

这里面的最大值也就是int的最大值,通过计算机可以得到2147483647,是一个十位数的值,我让它更加大一点:88888888,接下来执行F操作:

所以,经过F操作的数无论如何都会成环,就不存在一直算下去不成环的情况,只是框定数的最大范围不同,所执行的F操作的次数不同罢了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值