力扣 202. 快乐数 //快慢指针//哈希 3种方法

文章讲述了如何利用哈希表和快慢指针算法来判断一个整数是否为快乐数,包括计算快乐数的过程以及利用循环特性优化判断逻辑。
摘要由CSDN通过智能技术生成

//哈希

哈希: 其实int 最大为9位 假如最大 13位9的快乐数为1053 极限快乐数 每位值都为9 相加 为1053 所以最大的快乐数为1053 只有开始题目给你的数可能使你第一步为1053 此后 都是小于243 而且结果只有2种可能 一是循环1 而是形成环循环 一但出现第二个重复的数 如果不是一 就是false 第二个重复的数是一 就true;

代码:

bool isHappy(int n) {

   int hash[1060]={0};//记录遍历过的数

   while(1)

   {

       int sum=0;

       while(n)

       {

           int mid=n%10;

           sum=sum+mid*mid;

           n/=10;

       }

       if(hash[sum])

       {if(sum==1) return true;

       else return false;

       }

       hash[sum]++;

       n=sum;

   }

}

//快慢指针

关于循环的题可以快慢指针即是龟兔赛跑 快指针走俩步 慢指针走一步 快指针相对慢指针走一步 这2指针比在慢指针进入的第一圈相遇  若是一则true 否则是是环指针 其中相遇为环中一个节点值 必不为1 false

代码:

int end(int n) //创建找到下一个快乐数的函数

{

    int sum=0;

while(n)

{int mid=n%10;

sum=sum+mid*mid;

n/=10;

}

return sum;

}

bool isHappy(int n) {

    int low=n;

    int fast=n;

    do //因为初始化 刚开始相等 用do while

    {

        low=end(low); //慢指针走一步

        fast=end(end(fast)); //快指针走二步

    }while(fast!=low); //两者相遇跳出 low=fast

    if(low==1) return true;

    else return false;

}

最后一种是个这个题的巧劲 因为快乐数环循环中必有小于10的数 且只有1和7是快乐数

因此当快乐数小于10时跳出  判断是1和7 true 否则false

代码:

bool isHappy(int n) {

   

    if(n==1) return true;

   

    while(n>9)

    {int sum=0;

    while(n)

    {

        int mid=n%10;

        sum=sum+mid*mid;

        n/=10;

    }

    n=sum;

    }

    if(n==1||n==7) return true;

    else return false;

}

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值