Skip to content

Latest commit

 

History

History
66 lines (54 loc) · 1.74 KB

202.快乐数.md

File metadata and controls

66 lines (54 loc) · 1.74 KB

题目描述

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

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/happy-number

解题思路

这个可以用快慢指针来做, 因为快乐数规则, 要么无限循环;要么数结果变为1, 一直为1

  • 无限循环的情况 可以当成一个环形链表
  • 结果变为1, 可以假设成一个环形链表,每个数都是1

基于上面两点,我们用快慢指针解决141. 环形链表一样,当快慢指针相遇时(值相同), 要么是无限循环, 要么是1的循环, 此时我们只需要判断相遇时 快指针是否为1即可

代码如下

func isHappy(n int) bool {
    slow, fast := n, goForward(n)
    for fast != 1 && slow != fast {
        slow = goForward(slow)
        fast = goForward(goForward(fast))
    }
    return fast == 1
}

func goForward(n int) int {
    var sum int
    for n > 0 {
        sum += (n%10) * (n%10)
        n = n / 10
    }

    return sum
}

复杂度分析

TODO: 时间复杂度:O(logn)

空间复杂度:O(1) 无额外空间