快乐数(Leetcode第202题)

29 篇文章 2 订阅
本文探讨了一种算法问题,涉及数位平方和与哈希集合的使用。算法目的是找到给定数字nn的下一个“快乐数”。快乐数是指其数位平方和经过若干步迭代后达到1的数。通过数位分离计算平方和,并利用哈希集合检查是否形成循环,从而判断一个数是否为快乐数。代码实现中,用unordered_set存储中间结果,避免了重复计算,提高了效率。
摘要由CSDN通过智能技术生成

目录

 

1.题目描述

2.分析

3.算法

4.代码实现

5.知识点


1.题目描述

2.分析

此题可能会遇到三种情况:

其实第三种情况可以排除,举个例子就知道了

3.算法

算法分为两部分,我们需要设计和编写代码。

给一个数字 nn,它的下一个数字是什么?
按照一系列的数字来判断我们是否进入了一个循环。
第 1 部分我们按照题目的要求做数位分离,求平方和。

第 2 部分可以使用哈希集合完成。每次生成链中的下一个数字时,我们都会检查它是否已经在哈希集合中。

如果它不在哈希集合中,我们应该添加它。
如果它在哈希集合中,这意味着我们处于一个循环中,因此应该返回 false。

我们使用哈希集合而不是向量、列表或数组的原因是因为我们反复检查其中是否存在某数字。检查数字是否在哈希集合中需要 O(1)O(1) 的时间,而对于其他数据结构,则需要 O(n)O(n) 的时间。选择正确的数据结构是解决这些问题的关键部分

4.代码实现

class Solution {
public:
     int getNext(int n) {//数位分离函数
        int totalSum = 0;
        while (n > 0) {
            int d = n % 10;
            n = n / 10;
            totalSum += d * d;
        }
        return totalSum;
    }
    bool isHappy(int n) {
       unordered_set<int> set;//定义一个容器
        while (1) {
           int sum = getNext(n);
           if (sum == 1) {
               return true;
           }
           if (set.find(sum) != set.end()) {//判断容器中是否存在,若存在则是无限循环,即需跳出循环
               return false;
           } else {
               set.insert(sum);//插入容器
           }
           n = sum;
        }
        
    }
};

 

5.知识点

unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。

总的来说,unordered_set 容器具有以下几个特性:

  1. 不再以键值对的形式存储数据,而是直接存储数据的值;
  2. 容器内部存储的各个元素的值都互不相等,且不能被修改。
  3. 不会对内部存储的数据进行排序(这和该容器底层采用哈希表结构存储数据有关)

具体可参考网站:http://c.biancheng.net/view/7250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值