力扣 202. 快乐数

题目来源:https://leetcode.cn/problems/happy-number/description/

力扣 202. 快乐数_第1张图片

C++题解:当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

使用unordered_set存放平方和的值,如果平方和为1,则返回true,如果平方和已经存在unordered_set中,说明已经进入循环,不存在平方和,则返回false。

需注意unordered_set的find()函数,如果找到指定元素,它返回元素的迭代器,如果找不到指定元素,则返回指向unordered_set::end()的迭代器。所以并不能将其赋值,不能用true或者false来判断是否找到元素,要用end()函数。

class Solution {
public:
    bool isHappy(int n) {
        bool flg = false;
        unordered_set res;
        string a;
        int len = 0;
        while(1) {
            a = to_string(n);
            len = a.size();
            n = 0;
            for(int ii = 0; ii < len; ii++) {
                n = n + int(a[ii]-'0') * int(a[ii]-'0');
            }
            if(n == 1) return true;
            else if(res.find(n) != res.end()) break;
            else res.insert(n);
        }
        return flg;
    }
};

其他题解:跟我们的思路一致,但是我们求sum是转换成字符,网上的用了取余数。

class Solution {
public:
    // 取数值各个位上的单数之和
    int getSum(int n) {
        int sum = 0;
        while (n) {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set set;
        while(1) {
            int sum = getSum(n);
            if (sum == 1) {
                return true;
            }
            // 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
            if (set.find(sum) != set.end()) {
                return false;
            } else {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

你可能感兴趣的:(开始C++吧,leetcode,算法,c++,数据结构,哈希表)