LeetCode-202-快乐数

LeetCode-202-快乐数_第1张图片

1、哈希集合

为了判断这个数字在进行不断操作之后能否变为1,我们需要判断当前数是否会进入一个循环,因此我们可以使用哈希集合来记录我们在每次操作之后获得的新结果,若新结果已经在哈希集合中出现过,则说明接下来会进入循环,必不可能为1。

class Solution {
public:
    bool isHappy(int n) {
        unordered_set<int> hs;
        hs.insert(0);
        while (!hs.count(n)) {
            hs.insert(n);
            int temp = 0;
            while (n != 0) {
                temp += pow(n % 10, 2);
                n /= 10;
            }
            if (temp == 1) {
                return true;
            }
            n=temp;
        }
        return false;
    }
};

2、快慢指针

同样为了判断循环,我们还可以使用快慢指针进行判断。其中慢指针一次移动一步,快指针一次移动两步,若快慢指针指向相同对象则说明此处肯定已经进入循环,返回false;否则我们只需要比较当前结果是否为1即可。

class Solution {
public:
    int bitSquareSum(int n) {
        int sum = 0;
        while(n > 0)
        {
            int bit = n % 10;
            sum += bit * bit;
            n = n / 10;
        }
        return sum;
    }
    
    bool isHappy(int n) {
        int slow = n, fast = n;
        do{
            slow = bitSquareSum(slow);
            fast = bitSquareSum(fast);
            fast = bitSquareSum(fast);
        }while(slow != fast);
        
        return slow == 1;
    }
};

你可能感兴趣的:(LeetCode刷题记录,leetcode,算法,哈希算法)