Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

202. 快乐数 #10

Open
webVueBlog opened this issue Apr 21, 2022 · 1 comment
Open

202. 快乐数 #10

webVueBlog opened this issue Apr 21, 2022 · 1 comment
Labels

Comments

@webVueBlog
Copy link
Owner

编写一个算法来判断一个数 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
Copy link
Owner Author

/**
 * @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
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant