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函数拆解每一位的操作,再结合快慢指针的移动逻辑,就能解决快乐数的判断~

相关推荐
名字还没想好☜3 分钟前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
Wang's Blog19 分钟前
Java框架快速入门: Spring Security+OAuth2之短信服务多供应商动态切换(阿里云与LeanCloud)
java·spring·阿里云
Doubbbbbbble云26 分钟前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
小溪学编程29 分钟前
AQS 原理详解:从 CLH 队列到 ReentrantLock 的实现
java·开发语言
David猪大卫30 分钟前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
蜗牛互联网37 分钟前
语音AI开始边听边说,改变的不只是响应速度
java·人工智能·后端·语音识别
卓怡学长1 小时前
w233基于vue和springboot的宠物管理系统的设计与实现
java·vue.js·spring boot·spring·intellij-idea
我命由我123451 小时前
人脸识别 - 去重时间窗口
java·开发语言·python·学习·java-ee·学习方法·python3.11
逆境不可逃1 小时前
Pi Agent 学习笔记:一次提问背后的工具调用循环
java·笔记·学习
落魄大学生之流水线上谋生计2 小时前
Java并发核心机制详解:线程池、CAS、AQS、锁升级
java·开发语言·数据库