uacs2024

导航

leetcode202-快乐数

https://leetcode.cn/problems/happy-number/

一开始的错误代码

int sum;
        if(n==1)    return true;
        while(n>9)
        {
            sum=0;
            while(n)
            {
                sum += (n%10)*(n%10);
                n /= 10;
            }
            if(sum==1)  return true;
            n=sum;
        }
        return false;
这里没有考虑到个位数可以不断平方的情况,属于看题不仔细+没有考虑周全。最后404个测试点有几个没通过。
正确做法:
1.循环一定次数(比如100)还没到1的话就不符合题目条件
2.使用集合set记录原始数字和每一次的next,每次循环都先检查是否已经存在,如果已经存在则说明存在循环,不符合题目条件
   第二次提交的代码
   
class Solution {
public:
    int next(int n)
    {
        int sum=0;
        while(n)
        {
            sum += (n%10)*(n%10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        set<int> num;
        while(num.find(n)==num.end())
        {
            num.insert(n); 
            if(n==1)    return true; 
            n=next(n);         
        }
        return false;
    }
};
3.快慢指针
//参考英文网站热评第一。这题可以用快慢指针的思想去做,有点类似于检测是否为环形链表那道题
//如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值),也就是
//两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于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;
    }
}
 

posted on 2022-09-03 15:37  ᶜʸᵃⁿ  阅读(11)  评论(0编辑  收藏  举报