快乐数 | LeetCode-203 | 一个简单的数学题!| Floyd判圈算法练习题 | 哈希集合 | 数学

🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张

📌如果不知道Floyd判圈算法这道题做起来一点也不快乐!🎈前置知识:图解Floyd判圈算法 | 判断链表或者迭代函数是否有环 | Java代码

🙋大家好!我是毛毛张!
LeetCode链接:202. 快乐数

1.题目描述🍎

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

「快乐数」 定义为:

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

如果 n快乐数 就返回 true ;不是,则返回 false

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 < = n < = 2 31 − 1 1 <= n <= 2^{31} - 1 1<=n<=2311

2.题解🍑

2.1 Floyd判圈算法🥭

class Solution {
    public boolean isHappy(int n) {
        // 使用快慢指针法检测环的存在。快指针每次移动两步,慢指针每次移动一步。
        // 初始时,快指针移动两次后的结果,慢指针移动一次后的结果
        int fast = iterator(iterator(n));
        int slow = iterator(n);
        
        // 快慢指针相遇时,说明存在环
        while (fast != slow) {
            fast = iterator(iterator(fast)); // 快指针移动两次
            slow = iterator(slow);           // 慢指针移动一次
        }

        // 快慢指针相遇后,判断是否在环的入口,即是否为1
        return fast == 1;
    }

    // 辅助方法,用于计算数位平方和
    public int iterator(int n) {
        int sum = 0;
        while (n != 0) {
            int mod = n % 10; // 取出最低位数字
            sum += mod * mod; // 计算该数字的平方并累加到sum
            n = n / 10;       // 去掉最低位数字
        }
        return sum; // 返回累加的平方和
    }
}

2.2 哈希集合🍓

class Solution {
    public boolean isHappy(int n) {
        // 创建一个集合用于存储计算过程中出现过的数字,防止出现无限循环
        Set<Integer> set = new HashSet<>();
        int cur = n;  // 当前需要检查的数字
        
        // 循环进行计算,直到发现一个重复的数字
        while (!set.contains(cur)) {
            set.add(cur);  // 将当前数字加入集合
            cur = iterator(cur);  // 计算当前数字每位的平方和
        }
        
        // 如果循环退出时,cur等于1,说明n是快乐数
        return cur == 1;
    }

    // 计算一个数字每位的平方和
    public int iterator(int n) {
        int sum = 0;
        while (n != 0) {
            int mod = n % 10;  // 取出最低位数字
            sum += mod * mod;  // 计算该数字的平方并累加到sum
            n = n / 10;  // 去掉最低位数字
        }
        return sum;  // 返回累加的平方和
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神马都会亿点点的毛毛张

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值