★ 算法OJ题 ★ 力扣202 - 快乐数

Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起做一道双指针算法题--快乐数~

目录

[一 题目](#一 题目)

[二 算法解析](#二 算法解析)

[三 编写算法](#三 编写算法)


一 题目

202. 快乐数 - 力扣(LeetCode)

二 算法解析

题⽬告诉我们,当我们不断重复操作后,⼀定会出现死循环,有两种情况:

  • 情况⼀:⼀直在 1 中死循环,即 1 -> 1 -> 1 -> 1......。
  • 情况⼆:在历史的数据中死循环,但始终变不到 1。

因此,只要我们能确定循环中是否一直为1,就能得到结果。

那会不会出现一直没有循环的情况呢~ 以下是一个小证明~:

(鸽巢原理):有n+1个鸽子,n个巢,则至少有一个巢的鸽子数大于1。

  • 经过⼀次变化之后的最⼤值 9^2 * 10 = 810 ( 2^31-1=2147483647 。选⼀个更⼤的最⼤ 9999999999 ),也就是变化的区间在 [1, 810] 之间;
  • 根据鸽巢原理,⼀个数变化 811 次之后,必然会出现重复数
  • 因此,变化的过程最终会⾛到⼀个圈⾥⾯,因此可以⽤快慢指针来解决。

算法思路:

此题有点像链表带环问题,可以用快慢双指针 来求解,快慢指针有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的 ,也就是说他们总会相遇在⼀个位置上。如果相遇位置的值是 1 ,那么这个数⼀定是快乐数;如果相遇位置不是 1 的话,那么就不是快乐数。

三 编写算法

cpp 复制代码
class Solution {
public:
    int bitsum(int x) // 返回n这个数每⼀位上的平⽅和
    {
        int tmp = 0;
        int sum = 0;
        while (x)
        {
            tmp = x % 10;
            sum += tmp * tmp;
            x /= 10;
        }
        return sum;
    }

    bool isHappy(int n) 
    {
        int slow = n, fast = bitsum(n); //若fast也是n的话就不会进循环
        while (slow != fast)
        {
            slow = bitsum(slow);
            fast = bitsum(bitsum(fast));
        }
        return slow == 1;
    }
};
相关推荐
aramae14 分钟前
详细分析平衡树--红黑树(万字长文/图文详解)
开发语言·数据结构·c++·笔记·算法
一百天成为python专家17 分钟前
python爬虫入门(小白五分钟从入门到精通)
开发语言·爬虫·python·opencv·yolo·计算机视觉·正则表达式
再卷也是菜17 分钟前
C++篇(13)计算器实现
c++·算法
Mr YiRan25 分钟前
多线程性能优化基础
android·java·开发语言·性能优化
CHEN5_0229 分钟前
【leetcode100】和为k的子数组(两种解法)
java·数据结构·算法
熊猫钓鱼>_>31 分钟前
Java String 性能优化与内存管理:现代开发实战指南
java·开发语言·性能优化
练习时长一年36 分钟前
Spring容器的refresh()方法
java·开发语言
Codeking__40 分钟前
DFS算法原理及其模板
算法·深度优先·图论
第七种黄昏1 小时前
【前端高频面试题】深入浏览器渲染原理:从输入 URL 到页面绘制的完整流程解析
前端·面试·职场和发展
Arlene1 小时前
JVM Java虚拟机
java·开发语言·jvm