欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 【C++算法】4.双指针_快乐数

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

2024/11/14 13:18:21 来源:https://blog.csdn.net/hlyd520/article/details/142621503  浏览:    关键词:【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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com