zoukankan      html  css  js  c++  java
  • 快慢指针解决快乐数问题

    问题如下:

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

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

     

    题目来源:力扣(LeetCode)

    思路:

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

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

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

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

    想法

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

       怎么找呢?

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

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

       想想就不寒而栗。。。。

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

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

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

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

      废话少说,先贴代码:

     

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

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

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

    墨默后来也知道了:

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

  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/ambdyx/p/11627295.html
Copyright © 2011-2022 走看看