【力扣-哈希表】3、快乐数(202)

268 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

202. 快乐数

题目描述

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

「快乐数」定义为:

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

如果 n 是快乐数就返回 true ;不是,则返回 false 。

示例 1:

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

示例 2:

输入: n = 2
输出: false

暴力法(错误解法,虽然能过leetcode)

判断条件有误,考虑不周全

class Solution
{
public:
    bool isHappy(int num)
    {
        // 得到每次累加的和
        int sum = getSum(num);
        // 怕毛短是否
        while (sum != 1)
        {
            // 如果各位累加小于10,(漏洞:当sum=7时 ,结果为 1 符合要求)
            if (sum < 10)
            {
                return false;
            }
            sum = getSum(sum);
            
            
        }
        return true;
    }
    // 求和方法一
    // 定义函数求出数字各位累加的和
    int getSum(int num)
    {
        // 先将原始数字转换成字符串
        string s = to_string(num);
        int sum = 0;
        for (int i = 0; i < s.size(); i++)
        {
            // 数字从48开始的,所以强转后需要再减去48,不然数字会越来越大
            int n = int(s[i]) - 48;
            sum += n * n;
        }
        return sum;
    }
};

算法能在leetcode验证通过,但是存在很大漏洞 image.png

哈希法

题目描述中:可能会出现无限循环,则说明sum的值可能重复出现,那么就可以将出现过的值使用集合记录,如果重复出现了则可以判定数字的和不能满足要求。

class Solution
{
public:
    bool isHappy(int num)
    {
        int sum = getSum(num);

        // 记录出现过的sum值
        unordered_set<int> set;
        set.insert(sum);

        while (1)
        {
            // 判断sum值是否符合条件
            if (sum == 1)
            {
                return true;
            }
            sum = getSum(sum);
            if (set.find(sum) != set.end())
            {
                return false;
            }

            set.insert(sum);
        }
    }
    
    //求和方法二
    int getSum(int num)
    {
        int sum = 0;
        // 遍历num的各位
        while (num)
        {
            // 求各位数值的平方
            // 首先从个位开始计算
            sum += (num % 10) * (num % 10);
            // 数值每次缩小10倍
            num /= 10;
        }
        return sum;
    }
};

image.png