【双指针】快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。

  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。

  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

示例 1:

 输入:n = 19
 输出:true
 解释:
 12 + 92 = 82(2是平方)
 82 + 22 = 68
 62 + 82 = 100
 12 + 02 + 02 = 1

示例 2:

 输入:n = 2
 输出:false
 // 比如是 2 
 2->4->16->37->58->89->145->42->20->4  这是一个非快乐数  可以看到这是一个循环  
 //是19的话
 19->82->68->100->1->1->1.....
 //所以说快乐数和非快乐数就是一个是循环一直循环一个是可以得到1 然后在1中一直循环
 //所以我们用到快慢指针 如果说快慢指针相遇了是一的话就是快乐数
 class Solution {
 public:
     int ProductSum(int n){
         int sum = 0;
         while(n){
             int bit = n%10;
             sum += bit*bit;
             n = n/10;
         }
         return sum;
     }
     bool isHappy(int n) {
         int slow = n,fast = n;
         do{
             slow = ProductSum(slow);
             fast = ProductSum(fast);
             fast = ProductSum(fast);
         }while(slow != fast);
         return slow == 1;
     }
 };
 ​
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值