😭😭😭看到这个快乐数10s,我就知道快乐不属于我了🤪

引言

大家好啊,我是前端拿破轮😁。

跟着卡哥学算法有一段时间了,通过代码随想录的学习,受益匪浅,首先向卡哥致敬🫡。

但是在学习过程中我也发现了一些问题,很多当时理解了并且AC的题目过一段时间就又忘记了,或者不能完美的写出来。根据费曼学习法 ,光有输入的知识掌握的是不够牢靠的,所以我决定按照代码随想录的顺序,输出自己的刷题总结和思考 。同时,由于以前学习过程使用的是JavaScript,而在2025年的今天,TypeScript几乎成了必备项,所以本专题内容也将使用TypeScript,来巩固自己的TypeScript语言能力。

题目信息

快乐数

leetcode题目链接

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

「快乐数」 定义为:

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

题目分析

这个题目乍一看像一个数学问题,实际上并不是。关键在于题目中提到的要么在这个过程中成为1,要么无限循环但始终变不到一。

所谓的无限循环 不就是之前出现过的数还会再次出现 的意思吗?显然判断这种某个数是否在集合中出现过或出现多少次 ,最常用的就是哈希表了。

在本题目中,我们只需要使用一个Set。将每一次的每个位置上的平方和sum添加到Set中。一旦sum等于1,就返回true。如果sum没有出现过1,并且出现了循环,那么就意味着它永远不会再出现1了!!!。直接返回false。

上述便是此题的核心思想,至于说怎么求每一位的平方和,就很多方法了,可以把数字转成字符串再分割为数组然后求平方和,也可以直接使用求余数的方式把各个位置的数字求出来,再求平方和。

此外,本题还有另一种思路,就是双指针 。因为如果sum变为1之后,就一定永远是1, <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 2 = 1 1^2 = 1 </math>12=1,所以就相当于是一个只有一个元素的环。而其他无限循环的情况就类比为不止一个元素的环。整个题目可以类比🤯🤯🤯我人麻了!!!面试官:怎么判断链表是否有环?用两种不同的方法😏😏😏这篇文章的解法了。

把快乐数的循环当作链表的环,就成了判断链表环的问题,和之前的两种思路哈希表和双指针是一致的。

在这个情境中,慢指针每轮进行一次求和操作,而快指针每轮进行两次求和操作。当快满指针的求和相等时进行判断,如果相等的和为1,那么就是快乐数,否则不是。

题解

哈希表法

ts 复制代码
function isHappy(n: number): boolean {
    // set集合存放sum
    const set: Set<number> = new Set();

    // 开始循环
    while (true) {
        // 计算每一位的平方和
        const sum = [...String(n)].reduce((acc, cur) => acc + Number(cur) ** 2, 0);
        if (sum === 1) return true;
        if (set.has(sum)) return false;

        // 加入set
        set.add(sum);
        // 更新n
        n = sum;
    }
};

时间复杂度:O(logn)

空间复杂度:O(logn)

双指针法

ts 复制代码
function isHappy(n: number): boolean {
    // set集合存放sum
    const set: Set<number> = new Set();

    // 开始循环
    while (true) {
        // 计算每一位的平方和
        const sum = [...String(n)].reduce((acc, cur) => acc + Number(cur) ** 2, 0);
        if (sum === 1) return true;
        if (set.has(sum)) return false;

        // 加入set
        set.add(sum);
        // 更新n
        n = sum;
    }
};

时间复杂度:O(logn)

空间复杂度:O(1)

总结

本题考查的快乐数可以转换为链表环的判断,同样是哈希表和双指针两种思路。前者更容易理解,后者空间复杂度更优。

好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。

往期推荐✨✨✨

我是前端拿破轮,关注我,和您分享前端知识,我们下期见!

相关推荐
l1t31 分钟前
利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
xml·c语言·数据结构·人工智能·算法·解析器
华仔啊1 小时前
别再写 TypeScript enum了!新枚举方式让 bundle 瞬间小20%
javascript·typescript
宇钶宇夕1 小时前
西门子 S7-200 SMART PLC 编程:转换 / 定时器 / 计数器指令详解 + 实战案例(指令讲解篇)
运维·算法·自动化
我叫汪枫1 小时前
Spring Boot图片验证码功能实现详解 - 从零开始到完美运行
java·前端·javascript·css·算法·html
lifallen2 小时前
揭秘KafkaStreams 线程缓存:NamedCache深度解析
数据结构·算法·缓存·kafka·apache
我的知识太少了2 小时前
P1122 最大子树和
算法
郝学胜-神的一滴2 小时前
深入浅出 C++20:新特性与实践
开发语言·c++·程序人生·算法·c++20
Jelena技术达人2 小时前
淘宝/天猫按图搜索(拍立淘)item_search_img API接口实战指南
算法·图搜索算法
Adorable老犀牛2 小时前
阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
学习·算法·leetcode
望获linux2 小时前
【实时Linux实战系列】规避缺页中断:mlock/hugetlb 与页面预热
java·linux·服务器·数据库·chrome·算法