快乐数(力扣刷题)

简介: 快乐数(力扣刷题)

编写一个算法来判断一个数 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


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/happy-number


思路:


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


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


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


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


       还有一个难点就是求和的过程,如果对取数值各个位上的单数操作不熟悉的话,做这道题也会比较艰难。


代码如下:

class Solution 
{
public:
    int getNum(int n)
    {
        int sum = 0;
        while(n)
        {
            sum += (n % 10) * (n % 10);
            n = n /10;
        }
        return sum;
    }
    bool isHappy(int n)
     {
        unordered_set<int> set;
        while(1)
        {
            int sum = getNum(n);
            if(sum == 1)
            {
                return true;
            }
            if(set.find(sum) != set.end())
            {
                return false;
            }else
            {
                set.insert(sum);
            }
            n = sum;    
         } 
    }
};


相关文章
|
1月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
1月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
1月前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
1月前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
1月前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
1月前
【LeetCode刷题】专题三:二分查找模板
【LeetCode刷题】专题三:二分查找模板
【LeetCode刷题】专题三:二分查找模板
|
1月前
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
|
1月前
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
|
1月前
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
|
1月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串