美文网首页
快慢指针趣解快乐数问题

快慢指针趣解快乐数问题

作者: Ambrose墨默 | 来源:发表于2019-10-04 22:42 被阅读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 的循环中。

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

相关文章

  • 快慢指针趣解快乐数问题

    问题如下: 编写一个算法来判断一个数是不是“快乐数”。 一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它...

  • 双指针总结

    左右指针 主要解决数组中的问题:如二分查找 盛最多水的容器 三数之和 四数之和 最接近三数之和 快慢指针 主要解决...

  • LeetCode每日一题: 快乐数

    方法一:快慢指针 根据题意,重复的过程只有两种情况,一种是出现1,则为快乐数,另一种是无限循环,则不是快乐数,那么...

  • 快慢指针的应用

    快慢指针 快慢指针中的快慢指的是移动的步长,快慢分别指的是快指针每次移动两步,满指针每次移动一步 快慢指针的应用 ...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

  • 61.Rotate List-Leetcode

    debug遇到的问题 1.语法之指向指针成员 2.当k大于链表长度的情况下 拿到这题我首先想到的就是用快慢指针来解...

  • 快慢指针总结

    快慢指针 所谓「快慢指针」是指设定两个指针,其中快的指针的移动速度是慢的指针的移动速度的两倍;“快慢指针”方法主要...

  • 链表骚操作 --- 快慢指针

    快慢指针,顾名思义,就是操作链表的时候,使用两个指针,一快一慢。灵活使用快慢指针,可以巧妙的解决很多问题。本文将介...

  • 求链表的中间节点

    给定一个单向链表,怎么找到该链表的中位节点? 可以使用快慢指针,定义 2 个指针变量,慢指针移动步数为 1,快指针...

  • leetcode第142题:环形链表II [中等]

    题目描述 考点 链表 双指针(快慢指针) 解题思路 设置快慢指针slow, fast; 慢指针slow每次移动一个...

网友评论

      本文标题:快慢指针趣解快乐数问题

      本文链接:https://www.haomeiwen.com/subject/juaspctx.html