快慢指针趣解快乐数问题

问题如下:

编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。


image
image

题目来源:力扣(LeetCode)
思路:

我们的第一感官,这道题真简单 > ! 我也是这么想的,不就是求各个位上的数字然后平方和,再加个迭代就能证明它是所谓的快乐数了嘛!

然而,题目清楚地告诉我们,并不是所有的数都是快乐数。

在数字海洋里有一些有毒性的鱼儿,他们不喜欢 1 这个数字……

“不快乐数”会在这个过程中不断循环,可怕的事发生了,你的验证快乐数的程序会不断地循环……最后可能还会溢出……
想法

遇到这个问题,我第一个想法当然是在这个循环过程中找到这个不快乐数,并给出判断……

怎么找呢?

既然它是循环的,那么它一定有一个周期,,,,,

难道我要存储这些过程数,,,,然后一个一个比对吗?

想想就不寒而栗。。。。

这得需要牺牲多少内存和时间。。。。

所以啊,我们换一个思路。

好吧,墨默很笨,这个思路是参考大佬的,,,,,

大佬说,我们使用快慢指针的方法,,,,墨默孤陋寡闻,第一次听说这个所谓的快慢指针,,,

废话少说,先贴代码:
image
image

显而易见,fast是快指针,slow是慢指针。

在循环中快指针每次比慢指针多执行一步,所以当这个数是“不快乐数” 的时候快指针终究会领先慢指针一个周期,届时ishappy方法内的循环会终止并返回false。

相应的当这个数是“快乐数”时快指针会先到达1,显而易见,快指针到达1 之后将不再变化,慢指针最终也会到达1 ,届时就可以终止循环,返回true.

墨默后来也知道了:

不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。

可怜之前并不知道啊。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值