快慢指针解决快乐数问题

问题如下:

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

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

 

题目来源:力扣(LeetCode)

思路:

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

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

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

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

想法

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

   怎么找呢?

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

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

   想想就不寒而栗。。。。

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

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

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

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

  废话少说,先贴代码:

 

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

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

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

墨默后来也知道了:

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

原文地址:https://www.cnblogs.com/ambdyx/p/11627295.html