zoukankan      html  css  js  c++  java
  • 【LeetCode】202.快乐数

    题目链接

    https://leetcode-cn.com/problems/happy-number/

    题目描述

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

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

    如果 n 是快乐数就返回 True ;不是,则返回 False 。

    示例:
    输入:19
    输出:true
    解释:
    12 + 92 = 82
    82 + 22 = 68
    62 + 82 = 100
    12 + 02 + 02 = 1

     解题思路

    1.无论如何,都需要求解数n每一位的平方和(求解数字的每一位值是有模板的,只需要一个while循环即可搞定)。

    2.题目中说到经过变换的数字最终只有两种结果:变为1以及无限循环。对于最终变为1的情况很好处理,所以主要考虑经过处理后的数据变为无限循环的情况。

    经过分析,题目就变为如何处理经过处理后的数据变为无限循环的情况(以数字116为例)。

    • 可以利用结合set判断数据是否出现重复,如果是,则说明进入死循环。
    • 借鉴链表判断是否出现环的原理,利用快慢指针判断是否因为出现数字1而进入无限循环。

    AC代码

    1.采用set进行判断是否出现重复。

     1 class Solution {
     2 public:
     3     int cal(int n)
     4     {
     5         int sum = 0;
     6         while(n) //3行代码搞定求解数字n的每一位值
     7         {
     8             sum += (n % 10)*(n % 10);
     9             n = n / 10;
    10         }
    11         return sum;
    12     }
    13     bool isHappy(int n) {
    14         set<int> st;
    15         st.insert(n);
    16         while(true)
    17         {
    18             n = cal(n);
    19             if(n == 1) return true;
    20             if(st.count(n)) return false;
    21             else st.insert(n);
    22         }
    23         
    24     }
    25 };

    2.采用快慢指针

     1 class Solution {
     2 public:
     3     int cal(int n)
     4     {
     5         int sum = 0;
     6         while(n)
     7         {
     8             sum += (n % 10) * (n % 10);
     9             n = n / 10;
    10         }
    11         return sum;
    12     }
    13     bool isHappy(int n) {
    14         int fast = n;
    15         int slow = n;
    16         while(true)
    17         {  //快慢指针,slow走一步,fast走两步。
    18             slow = cal(slow);
    19             fast = cal(fast);
    20             fast = cal(fast);
    21             if(slow == fast) break;
    22         }
    23         // if(slow == 1) return true;
    24         // else return false;
    25         return slow == 1;//判断是否是因为数字1而进入死循环,如果是则返回true,
    26 
    27     }
    28 };
  • 相关阅读:
    jquery的ready和简写
    javasript之ajax学习笔记
    用 Drupal 创建更好的评分系统的具体步骤
    drupal的FIVESTAR投票模块说明
    drupal中时间自定义格式
    drupal首页不显示默认内容列表方法
    基于 Zen 创建一个 Drupal 7 的主题(模板) ,一份简单的Drupal模板教程
    jquery tooltip事件
    HTML5地区自转代码
    转:Jmeter常见问题 (转载) http://www.51testing.com/?uid-128005-action-viewspace-itemid-84094
  • 原文地址:https://www.cnblogs.com/XDU-Lakers/p/12812857.html
Copyright © 2011-2022 走看看