Leetcode202. 快乐数 -代码随想录

本文介绍了如何使用C++实现快乐数算法,包括原始版本中使用哈希表检测重复数,以及优化后的版本,提高了代码效率。作者分享了两次解题过程和优化思路。
摘要由CSDN通过智能技术生成

题目:


代码(首刷自解 2024年1月15日):

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

        这个题自己十分钟做出来了,虽然是道简单题,但还是说一下做题过程:

        首先,根据题意将快乐数的求解过程用代码表示出来(也就是文中不含哈希表的部分)。

        然后发现一个问题,如果while循环n!=1就永远不会退出循环,于是要想办法当程序知道什么时候将永远不会等于1。

        很显然,当计算过程出现一个重复的数后,就永远不会等于1,自然而然想到用哈希表记录曾经的数,如果发生重复,就退出循环,返回false。


代码(二刷自解 2024年4月23日 6min BUGFREE)

class Solution {
public:
    bool isHappy(int n) {
        // 哈希
        unordered_set<int> visited;
        // 计算一次快乐数,检测是否在hash内存在,若存在,返回false
        while (n != 1) {
            int sum = 0;
            while (n) {
               sum += pow(n % 10, 2);
               n /= 10; 
            }
            if (visited.contains(sum)) {
                return false;
            } else {
                visited.insert(sum);
            }
            n = sum;
        }
        return true;
    }
};

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值