LeetCode—快乐数(快慢指针法)

快乐数(简单)

2020年5月25日

题目来源:力扣

在这里插入图片描述

解题
这道题关键是找到无限循环的终止点。
可以用集合来记录出现过的数字,当出现了一个出现过的数字则说明进入循环,返回false;当出现1时,返回true。但这种做法时间复杂度和空间复杂度不确定性太大,如果有过多的数可能会导致栈溢出,不建议使用。

用在LeetCode—环形链表中使用过的“快慢指针法”来判断循环,如果有循环,那么快指针和慢指针终究会相遇,相遇时判断快指针或慢指针的值是否为1,若为1返回true,不为1返回false。

如果快指针优先走到了1,1的平方也还是1,会继续循环1,等待慢指针跟它相遇。

class Solution {
    public boolean isHappy(int n) {
        int fast=n,slow=n;
        do{
            slow=num(slow);
            fast=num(fast);
            fast=num(fast);
        }while(slow!=fast);
        return (fast==1);
    }
    public int num(int n){
        int sum=0;
        while(n!=0){
            sum+=Math.pow(n%10,2);
            n/=10;
        }
        return sum;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41541562/article/details/106326503
今日推荐