202. 快乐数(力扣LeetCode)

文章目录

  • 202. 快乐数
    • 题目描述
    • c++代码

202. 快乐数

题目描述

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
    如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

c++代码

这道题目看上去貌似一道数学问题,其实并不是!

题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

判断sum是否重复出现就可以使用unordered_set。

class Solution {
public:
    bool isHappy(int n) {
        // 创建一个unordered_set来存储之前出现过的数字
        unordered_set<int> num;
        
        // 使用无限循环,只有找到快乐数或者进入循环时才会退出
        while(1) {
            // 计算n的每个位数上的数字的平方和
            int sum = get_sum(n);
            
            // 如果平方和为1,则n是一个快乐数,返回true
            if(sum == 1) return true;
            
            // 如果sum已经在之前出现过,则说明进入了循环,返回false
            if(num.find(sum) != num.end())
                return false;
            else
                // 否则在set中记录这个sum,并继续循环
                num.insert(sum);
            
            // 将n更新为其位数平方和,进行下一轮循环
            n = sum;
        }
    }

private:
    // 辅助函数用于计算一个数字的每位数字的平方和
    int get_sum(int n) {
        int sum = 0;
        while(n) {
            // 对n取模得到最后一位数字,并计算其平方
            sum += (n % 10) * (n % 10); // 注意这里加上括号防止运算符优先级问题
            // 将n除以10以删除最后一位数字
            n /= 10;
        }
        // 返回所有位数的平方和
        return sum;
    }
};

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展,c++)