双指针算法_快乐数

 

题目:

  • 对于一个正整数,每一次将该数替换成为,它的每一位数的平方之和
  • 然后反复循环这个过程,直到这个数变成1,但是也可能无线循环达不到1
  • 如果这个数能变成1,这个数就是快乐数

示例:

示例图解:

通过示例的图解可以看出,如果计算的过程中出现了1,那么就将会在1时进行持续的循环,使得变成一个1的循环,而如果在计算的过程中,没用出现1,则会在计算的过程中,得出某个结果和之前计算的结果一致,成为一个环状。

所以最后可以得出,如果有出现1则会进入1的循环,如果没用出现1则一直循环都有1。 

算法原理:

这题和判断链表是否有环很像!不过这里只要判断环里面的数字是否是1,所以可以采取判断链表是否有环的方法,使用快慢双指针。

定义快慢指针的方法和判断链表循环的双指针方法一样,快指针每次移动两次,慢指针每次移动一次,当二者相遇时,判断二者执行的数值是否是1即可!(因为如果有1则快指针会进入1的循环,慢指针遇到快指针时,也表示了慢指针进入了1的循环)

 

代码编写: 

主要分为两步,一步是用来计算每一位数字的各个位数上的数字平方之和,一步是双指针进行移动的!

第一步:

第二步:

这里用数字来充当指针,slow最终会遇到fast的,当遇到时,就相当于在之前的循环中循环到之前计算过的数字

如果这个数字是1则快乐数,不是1则不是

while中的slow调用了一次函数表示走一次,fast嵌套了函数表示走两次

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值