3.快乐数专题学习笔记——双指针法在LeetCode 202题中的应用

目录

[一、题目解析(来自LeetCode 202题)](#一、题目解析(来自LeetCode 202题))

快乐数的定义:

示例:

二、算法原理:快慢指针(类比链表找环)

核心思路:

理解:

三、代码实现(Java)

总结


今天在刷LeetCode的时候,遇到了第202题「快乐数」,结合联系链表是否有环这一个知识,我把学习过程整理成了这篇博客~

一、题目解析(来自LeetCode 202题)

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

题目要求:编写一个算法判断一个数 n是不是快乐数

快乐数的定义:

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

示例:

  • 输入 n = 19,输出 true。解释:

  • 输入 n = 2,输出 false(会进入无限循环,永远到不了1)。

二、算法原理:快慢指针(类比链表找环)

做这道题时,可以把快乐数的计算过程类比成链表的遍历,用「快慢指针」来判断是否陷入循环时的数字。

核心思路:

  • 慢指针 slow:每次只走一步(即计算一次「数字平方和」)。

  • 快指针 fast:每次走两步(即计算两次「数字平方和」)。

  • 如果过程中 fast遇到 1,说明是快乐数;如果 slowfast相遇(且不是1),说明陷入循环,不是快乐数。

理解:

比如 n=2的计算过程:2 → 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 → ...这里进入了循环(4之后又回到4)。用快慢指针的话:

  • slow初始为 2fast初始为 bitSum(2)=4

  • 第一次循环:slow = bitSum(2)=4fast = bitSum(bitSum(4))=bitSum(16)=37

  • 第二次循环:slow = bitSum(4)=16fast = bitSum(bitSum(37))=bitSum(58)=89

  • ...... 直到 slowfast相遇(或 fast到1)。

三、代码实现(Java)

我给的代码非常清晰,分为两个函数:bitSum计算数字的每一位平方和,isHappy用快慢指针判断是否为快乐数。

java 复制代码
class Solution {
    // 返回n这个数每一位上的平方和
    public int bitSum(int n) {
        int sum = 0;
        while (n != 0) {
            int t = n % 10;  // 取最后一位
            sum += t * t;    // 平方累加
            n /= 10;         // 去掉最后一位
        }
        return sum;
    }

    public boolean isHappy(int n) {
        int slow = n, fast = bitSum(n);  // 慢指针从n开始,快指针先走一步
        while (slow != fast) {           // 相遇时退出循环
            slow = bitSum(slow);         // 慢指针走一步
            fast = bitSum(bitSum(fast)); // 快指针走两步
        }
        return slow == 1;  // 相遇时是1则是快乐数,否则不是
    }
}

总结

这道题的核心是把「数字平方和的循环计算」转化为「链表找环」问题 ,用快慢指针高效判断。通过 bitSum函数拆解每一位的操作,再结合快慢指针的移动逻辑,就能解决快乐数的判断~

相关推荐
无限进步_1 小时前
【C++】深入底层:自己动手实现一个哈希表
开发语言·数据结构·c++·算法·链表·散列表·visual studio
_深海凉_1 小时前
LeetCode热题100-小于 n 的最大数(字节高频题)
算法·leetcode·职场和发展
liann1191 小时前
Agent 内存马禁止 Attach JVM
java·jvm·安全·网络安全·系统安全·网络攻击模型·信息与通信
小雅痞1 小时前
[Java][Leetcode middle] 36. 有效的数独
java·算法·leetcode
代码漫谈1 小时前
JVM 参数调优:Spring Boot与JDK新特性的最佳结合
java·jvm·spring boot
paeamecium1 小时前
【PAT甲级真题】- General Palindromic Number(20)
数据结构·c++·算法·pat考试·pat
卷毛的技术笔记2 小时前
双十一零点扛过10倍流量洪峰:Sentinel与Redis+Lua的分布式限流深度避坑指南
java·redis·分布式·后端·系统架构·sentinel·lua
逻辑驱动的ken2 小时前
Java高频面试考点场景题27
java·开发语言·面试·职场和发展·求职招聘
北顾笙9802 小时前
day43-数据结构力扣
数据结构·算法·leetcode