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

//哈希

力扣 202. 快乐数 //快慢指针//哈希 3种方法_第1张图片

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

力扣 202. 快乐数 //快慢指针//哈希 3种方法_第2张图片

力扣 202. 快乐数 //快慢指针//哈希 3种方法_第3张图片

代码:

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

力扣 202. 快乐数 //快慢指针//哈希 3种方法_第4张图片

代码:

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;

}

你可能感兴趣的:(leetcode,算法)