力扣刷题Days9--202.快乐数(js)

本文介绍了如何使用哈希算法和快慢指针判断一个数是否为快乐数,分析了问题的两种可能情况,并提供了相应的代码实现。重点在于算法的逻辑和性能优化。
摘要由CSDN通过智能技术生成

目录

1,题目

2,代码

2.1哈希算法

2.2快慢指针

3,学习与总结

3.1题目分析

3.2 算法实现

3.3总结


1,题目

编写一个算法来判断一个数 n 是不是快乐数。如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

「快乐数」 定义为:

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


2,代码

2.1哈希算法

/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function(n) {
    // 数位分离,求平方和
    const getNext = (n) => {
    let totalSum = 0;
    while (n > 0) {
        let d = n % 10;
        n = Math.floor(n / 10);
        totalSum += d * d;
    }
        return totalSum;
    };
        // 函数主题
    
    const hashtable = new Set()

    while(n!=1 && !hashtable.has(n)){
        hashtable.add(n);
        n=getNext(n);
    }
    return n===1;
};

2.2快慢指针

/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function(n) {
    // 数位分离,求平方和
    const getNext = (n) => {
    let totalSum = 0;
    while (n > 0) {
        let d = n % 10;
        n = Math.floor(n / 10);
        totalSum += d * d;
    }
        return totalSum;
    };
    // 快慢指针构造
    let slowRunner = n;
    let fastRunner = getNext(n);
    while(fastRunner!=1 && fastRunner!=slowRunner){
        slowRunner=getNext(slowRunner);
        fastRunner=getNext(getNext(fastRunner));
    }
    return fastRunner === 1;
};

3,学习与总结

3.1题目分析

(1)初步判断 出现的情况有:

  • 最终得到1
  • 最终陷入循环
  • 值会趋近无穷大

(2)对 值是否会趋近无穷大 的情况进行分析

思考出发点:每一位数的最大数字的下一位数是多少。

对于 3位数的数字,它不可能大于 243。这意味着它要么被困在 243 以下的循环内,要么跌到 1。4位或 4位以上的数字在每一步都会丢失一位,直到降到 3位为止。

所以我们知道,最坏的情况下,算法可能会在 243以下的所有数字上循环,然后回到它已经到过的一个循环或者回到 1。但它不会无限期地进行下去,所以我们排除第三种选择。

作者:力扣官方题解

(3)从而 一共有两种情况:

  • 最终获得1
  • 陷入循环

3.2 算法实现

(1)哈希算法

  • 哈希表来管理生成的数字,一旦有数字已经出现在哈希表中,则说明会陷入循环;

(2)快慢指针算法

  • 生成一个隐式链表;
  • 跟踪两个值,称为快跑者和慢跑者;快跑者在链表中前进两个节点,,慢跑者在链表中前进一个节点;
  • 循环体内,快跑者会和慢跑者‘相遇’;

3.3总结

题目背后的情况分析;

算法的应用;


勉励自己:贵在坚持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值