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

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

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解:


题目链接:

202.快乐数


题目描述:

8c8ac65ec9e3f24bef8b55ce1c7d68fa


解法

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

a6abd77fa136ac31325ebc7db789a406

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

0f74c8d590953a1dd26888326e4f649a

快慢双指针

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

    例如:n = 19

    slow = 12+92=82

    fast = 82+22=68

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

    快指针每次向后移动两步

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


C++ 算法代码:

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

http://www.kler.cn/news/329964.html

相关文章:

  • redis 中IO多路复用与Epoll函数
  • 结合了LLM(大语言模型)的编辑器,不仅能理解人类语言,还能与用户互动,仿佛有了自己的思想。...
  • [倍福PLC]TwinCAT标准数据类型
  • WIFI网速不够是不是光猫的“路由模式”和“桥接模式”配置错了?
  • 在CentOS 7上安装WordPress的方法
  • 深入理解 C 语言中的内存操作函数:memcpy、memmove、memset 和 memcmp
  • Leetcode 每日一题:Crack The Safe
  • OSINT技术情报精选·2024年9月第4周
  • 经典面试题目---Spring IOC容器的核心实现原理
  • 数字控制系统
  • 区块链技术简介
  • 利用QGIS将.shp文件转换成json文件
  • VR 尺寸美学主观评价-解决方案-现场体验研讨会报名
  • 简单实现log记录保存到文本和数据库
  • 【Ubuntu】apt安装时报错:不再含有 Release 文件
  • ab plc1756连接Profinet 转 EtherNet/IP 网关进行数据交互
  • 面试速通宝典——7
  • 《应用科学学报》
  • macOS安装MySQL教程, 2024年9月26日更新, 亲测有效, 附有百度网盘下载链接
  • 金融科技驱动未来:智慧金融的崛起与应用