202. 快乐数

#202. 快乐数

难度:简单 2020/4/30每日一题打卡
四月份的每日一题打卡就这样结束了,呜呜还有点舍不得。第一次坚持了一个月,以后也要继续加油啊!
题目描述
在这里插入图片描述
解题思路
快乐暴力法
这个题其实也不难,关键在于死循环的判断,看了评论之后发现如果进入死循环,会有固定的套路-----------------不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。
所以只要循环中出现这里面任何一个数字,代表进入了死循环,结束循环就完事了。

public boolean isHappy(int n) {
        int temp = 0;
        while(n != 0){
            temp += (n%10)*(n%10);
            n = n/10;
            if(n == 0){
                if(temp == 1) return true;
                if(temp == 4) return false;
                n = temp;temp = 0;
            }
        }
        return false;
    }

在这里插入图片描述

高级快慢指针法
看评论的时候还学习到了一种快慢指针思想:大概是一个快指针,一个慢指针,两个总会相遇,要么结束循环相遇,要么中间相遇。

//参考英文网站热评第一。这题可以用快慢指针的思想去做,有点类似于检测是否为环形链表那道题
//如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值),也就是
//两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于1。
class Solution {
    public boolean isHappy(int n) {
        int fast=n;
        int slow=n;
        do{
            slow=squareSum(slow);
            fast=squareSum(fast);
            fast=squareSum(fast);
        }while(slow!=fast);
        if(fast==1)
            return true;
        else return false;
    }
    
    private int squareSum(int m){
        int squaresum=0;
        while(m!=0){
           squaresum+=(m%10)*(m%10);
            m/=10;
        }
        return squaresum;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值