首页 > 其他 > 详细

快慢指针解决快乐数问题

时间:2019-10-06 15:34:35      阅读:126      评论:0      收藏:0      [点我收藏+]

问题如下:

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

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!