题目解析及算法原理
有题目可知判定快乐数的条件是循环过程中成环,那我们就可以直接按所给例子(这里省去了按各位数相加的操作)画图:
根据是快乐数所画出来的图可以看得出这个结构与链表非常相似,那么这时候就可以使用双指针算法,将数和算出来的数当作指针,借用成环的结构,那就可以构造出两个快慢指针相追的场景.
实现步骤:
记每次计算数的每一位的平方和的操作为F
1.定义快慢双指针,初始值:慢指针为给定数,快指针为给定数执行一次F的数
2.借助循环构造追赶的操作,快指针走两步(执行两次F操作),慢指针走一步(执行一次F操作)
3.跳出循环,判断相遇时的任意指针的数值
代码实现:
拓展:
读者有没有想过,如果题目中没有给出成环的提示,那么会不会一直就不会成环,接下来我就给大家证明一下为什么链表一定会成环?
数学知识补充:
鸽巢原理(又称抽屉原理):有n个巢,有n+1个鸽子--->至少有一个巢的鸽子数大于1
题目中还有一个提示:
这里面的最大值也就是int的最大值,通过计算机可以得到2147483647,是一个十位数的值,我让它更加大一点:88888888,接下来执行F操作:
所以,经过F操作的数无论如何都会成环,就不存在一直算下去不成环的情况,只是框定数的最大范围不同,所执行的F操作的次数不同罢了