Leetcode icon indicating copy to clipboard operation
Leetcode copied to clipboard

202. 快乐数

Open webVueBlog opened this issue 2 years ago • 1 comments

编写一个算法来判断一个数 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 <= 231 - 1

/**
 * @param {number} n
 * @return {boolean}
 202. 快乐数
 当它最后是快乐数,最后是能够得到1这个值的
 1这个值就相当链表的尾节点就一个空节点
 如果不是快乐数 说明它会一直的去 在某一个数
 通过计算之后会等于前面的某一个数
 这样的话它才会 一直的循环下去形成闭环
 */
var isHappy = function(n) {
    // 1 <= n so 等于1的话它就是一个快乐数
    if(n === 1) return true
    // 首先我们定义一个map结构
    let mapper = new Map()
    let p = getNext(n)
    // 如果p不等于1的话
    while(p !== 1) {
        if(!mapper.has(p)) {
            mapper.set(p, p)
            p = getNext(p)
        } else {
            return false
        }
    }
    // 跳出循环的时候
    // 走到了最后一个节点也就是为1
    return true
};

// 获取它的下一个节点
var getNext = function(n) {
    let sum = 0
    while(n) {
        // 计算的话我们从它的末位开始去 平方和相加
        sum += (n % 10) ** 2 // 9
        // 把n赋值为就是把它的个位数砍掉
        n = Math.floor(n / 10) // 1
    }
    // 计算完成之后,我们再把和返回出来
    return sum
}


webVueBlog avatar Apr 21 '22 03:04 webVueBlog

/**
 * @param {number} n
 * @return {boolean}
 202. 快乐数
 快慢指针的方法
 */
var isHappy = function(n) {
    // 第一步判断n是不是等于1
    if(n === 1) return true
    // 定义两个指针,一个每次走一步
    let p = getNext(n)
    // 一个每次走两步
    let q = getNext(getNext(n))
    // 循环条件
    while(p !== q && q !== 1) {
        p = getNext(p)
        q = getNext(getNext(q))
    }
    return q === 1
};

// 获取它的下一个节点
var getNext = function(n) {
    let sum = 0
    while(n) {
        // 计算的话我们从它的末位开始去 平方和相加
        sum += (n % 10) ** 2 // 9
        // 把n赋值为就是把它的个位数砍掉
        n = Math.floor(n / 10) // 1
    }
    // 计算完成之后,我们再把和返回出来
    return sum
}


webVueBlog avatar Apr 21 '22 04:04 webVueBlog