当前位置: 首页 > article >正文

C++ 快乐数 —— 优先算法(双指针思想)

目录

1. 题目解析 

2. 算法原理

3. 代码实现


 快乐数

1. 题目解析 

 根据题目可知:快乐数就是对于一个数,它的每位上的数字的平方和,最终结果是到1。

 2. 算法原理

从题目解析上两个图对比来看

所以可以抽象成环形链表的问题,解法就用快慢双指针。(注:这里双指针是一种思想,并不是真正意义上要定义两个指针,用一个数看作成一个指针来控制)

解法思想:

  1. 定义快慢指针(fast,slow)
  2. 慢指针每次向后移动一步,快指针每次向后移动两步。
  3. 判断相遇时的值即可,是1就是快乐数,不是1就不是快乐数(注:通过题目给予的定义来看是一定会相遇的)。

题外话:快慢双指针解决环形链表时,是通过判断两个指针是否相遇即可。 

为快乐数的情况:

 不为快乐数的情况:

 

 

  

3. 代码实现

 根据上述分析:

class Solution {
public:
    //求平方和后续会用的频繁
    //因此把它封装到类里面,默认内联函数
    //减少函数调用的开销
    int bitSum(int n) // 返回n这个数的每一位数的平方相加的和
    {
        int sum = 0;
        // 先把最后一个数取出来,平方一下放到一个变量里,然后干掉最后一位数
        while (n) {
            int t = n % 10;
            sum += t * t;
            n /= 10;
        }

        return sum;
    }

    bool isHappy(int n) {
        // 抽象成快慢指针的解法
        int fast = bitSum(n), slow = n;  
        //因为一定是会相遇的,
        //先让fast走一步,以防止进入不了while循环
        while (slow != fast) {
            //fast要比slow快
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }
        return slow == 1;   //返回判断是否等于1
    }
};

链接跳转:快乐数

提交记录:

制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!!  


http://www.kler.cn/a/374181.html

相关文章:

  • DDRPHY数字IC后端设计实现系列专题
  • 【Linux:TCP通信流程】
  • 0,国产FPGA(紫光同创)-新建PDS工程
  • MFC工控项目实例二十七添加产品参数
  • Redis 实战 问题
  • 【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】
  • 模板初阶及STL简介
  • 鸿蒙HarmonyOS NEXT一多适配技术方案
  • vue 和 django 报 CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,
  • 二百七十五、Kettle——ClickHouse增量导入数据补全以及数据修复记录表数据(实时)
  • 20.04Ubuntu搭建Vscode
  • Nature Electronics 用于语音识别的液体声传感器,基于悬浮在载液的钕-铁-硼磁性纳米颗粒
  • AI内容生成器 V1.6 WordPress插件 基于AI生成内容 Openai Content Generator
  • 数据结构-希尔排序(ShellSort)笔记
  • 重新架构:从 Redis 到 SQLite 性能提升
  • MySQL基本用法
  • 经典面试题收集(持续更新)
  • 基于人脸识别PCA算法matlab实现及详细步骤讲解
  • 面试题整理 3
  • 我自己的资料整理导引(三):文本格式基础
  • C++算法练习-day29——104.二叉树的最大深度
  • Java基础3-字符串及相关操作
  • 使用正则表达式验证积累
  • springSecurity入门(5.7版本之前)
  • 各种语言的列表推导式与三元?表达式,C++,python,rust,swift,go
  • ubuntu20.04 加固方案-设置重复登录失败后锁定时间限制