LeetCode经典——202.快慢指针之快乐数

目录

瞎暴力1:找出死循环数的规律

瞎暴力2:遇到超过100次以上循环还没找到认为是死循环

快慢指针法:


这题真的是很有意思!先看题目:

可以看出关键是判断是否有死循环的出现!

怎么判断呢,有很多中投机取巧的方法,先看两个:

瞎暴力1:找出死循环数的规律

所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。

class Solution {
public:
    bool isHappy(int n) {
        int ans,temp;
        while(true){
            vector<int> v;
            ans=0;
            while(n!=0){
                temp = n%10;
                ans+=temp*temp;
                n/=10;
            }
            if(ans == 1)
                return true;
            else if(ans==4)//遇到4肯定死循环!
                return false;
            n = ans;
        }
        return false;
    }
};

瞎暴力2:遇到超过100次以上循环还没找到认为是死循环

这种做法面试肯定挂哈哈,不过快乐数快乐就完事了

class Solution {
public:
    bool isHappy(int n) {
        int ans=0;
        for(int i = 0 ; i< 100;i++)
        {
            while(n>0)
            {
                ans += (n%10)*(n%10);
                n = n /10;
            }
            n = ans;
            if(n==1)
                return true;
        }
        return false;
    }
};

快慢指针法:

有点类似于检测是否为环形链表那道题,如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值),也就是两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于1。

class Solution {
public:
    int squareSum(int n){//
        int ans = 0,temp;
        while(n!=0){
            temp = n%10;
            ans+=temp*temp;
            n/=10;
        }
        return ans;
    }
    bool isHappy(int n) {
        // 利用快慢指针思想, 慢指针每次做一次转换, 快指针每次做两次转换
        // 如果出现无限循环, 那么快慢指针一定相遇
        int slow = squareSum(n),fast = squareSum(squareSum(n));
        while(slow!=fast){
            slow = squareSum(slow);
            fast = squareSum(squareSum(fast));
        }
        return slow==1;
    }
};
发布了377 篇原创文章 · 获赞 344 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/105476113