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 的循环中。

  • 相关阅读:
    装饰设计模式
    Enum的基本使用
    java根据文件流判断文件类型(后缀名)
    Java正则表达式的用法
    java遍历Map
    java操作json
    struts2+ajax+jquery
    Hibernate注解
    oracle经典建表语句--scott建表
    Struts2 ui标签
  • 原文地址:https://www.cnblogs.com/ambdyx/p/11627295.html
Copyright © 2011-2022 走看看