当前位置:   article > 正文

每日OJ题_算法_双指针③_力扣202. 快乐数

每日OJ题_算法_双指针③_力扣202. 快乐数

目录

力扣202. 快乐数

解析代码


力扣202. 快乐数

202. 快乐数 - 力扣(LeetCode)

难度 简单

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

「快乐数」 定义为:

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

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

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

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 23^1 - 1
  1. class Solution {
  2. public:
  3. bool isHappy(int n) {
  4. }
  5. };

解析代码

类似判断环形链表的快慢指针,了解一下鸽巢原理:

看一下环形链表的讲解:

数据结构与算法⑥(第二章OJ题,下)后八道链表面试题-CSDN博客

此题为什么一定会成环?:

此题中最大范围为23^1 - 1 等于 2.1*10^9 小于 9999999999(10个9)-> 每个数平方后相加为9^2 * 10 = 810,所以超过810次每个数平方后,至少会有两个数落在[1,810],此时成环的时候slow等于1就是快乐数。

通过代码:

  1. class Solution {
  2. public:
  3. int bitSum(int n)
  4. {
  5. int sum = 0;
  6. while(n)
  7. {
  8. int x = n % 10;
  9. sum += x*x;
  10. n /= 10;
  11. }
  12. return sum;
  13. }
  14. bool isHappy(int n) {
  15. int slow = n, fast = bitSum(n);
  16. while(slow != fast)
  17. {
  18. slow = bitSum(slow);
  19. fast = bitSum(bitSum(fast));
  20. }
  21. return slow == 1;
  22. }
  23. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/85016
推荐阅读
相关标签
  

闽ICP备14008679号