【C++算法】4.双指针_快乐数

文章目录


题目链接:

202.快乐数


题目描述:


解法

根据题目来看,可能是无限循环,也可能是快乐数。因为就相当于下图:

无限循环可以看成一个圈,快乐数得到的1也可以看成一个圈。因为对1求快乐数得到的也是1,相当于在1里循环。所以就相当于下图。

快慢双指针

  1. 定义快慢指针(用数来充当指针)

    例如:n = 19

    slow = 12+92=82

    fast = 82+22=68

  2. 慢指针每次向后移动一步

    快指针每次向后移动两步

  3. 因为快慢指针速度不一样,所以如果存在环的话,两个指针一定会在环里的某处相遇的(前面数据结构博客里面环形链表讲过这个)博客链接🔗


C++ 算法代码:

cpp 复制代码
class Solution 
{
public:
    int bitSum(int n) // 返回 n 这个数每一位上的平方和
    {
        int sum = 0;
        while(n)//把最后一位拿出来,然后除以10,循环直到为0为止。
        {
            int t = n % 10;
            sum += t * t;
            n /= 10;
        }
        return sum;//sum就是最终结果
	}
    
    bool isHappy(int n)
    {
        //用数来充当指针
        int slow = n, fast = bitSum(n);//这里fast是n求过一次平方和的值,目的是能够顺利进入下面的循环。因为如果fast和slow都是n的话,就无法循环了
        while(slow != fast)//slow!=fast就一直循环
        {
            slow = bitSum(slow);//慢指针走1步
            fast = bitSum(bitSum(fast));//快指针走2步
        }
        return slow == 1;//slow=1就是快乐数,不是1就不是快乐数
    }
};

图解:

输入19

  1. slow=19,fast=82
  2. slow=82,fast=100
  3. slow=68,fast=1
  4. slow=100,fast=1
  5. slow==fast
  6. return slow==1
相关推荐
hetao17338376 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J7 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康7 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a187927218317 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN9 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆10 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
raindayinrain10 小时前
c++并发
c++
j7~10 小时前
【C++】智能指针的使用及其原理--详解
c++·c++11·内存泄漏·智能指针·raii·boost智能指针
阳明山水11 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技11 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算