快乐数

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

「快乐数」定义为:

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

 

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/happy-number 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

我的做法:猛干法

时间:击败100%

内存:击败10%(猛干法还是有代价的)

代码(Golang):

import (
    "strconv"
)
func isHappy(n int) bool {
    str_n := strconv.Itoa(n)
    sum := 0
    m := make(map[int]int)
    for sum != 1 {
        for _, i := range str_n {
            b, _ := strconv.Atoi(string(i))
            sum += b * b
        }
        if sum == 1 {return true}
        m[sum]++
        if m[sum] > 1 {return false}
        str_n = strconv.Itoa(sum)
        sum = 0
    }
    return true
}

思路:

  1. 首先把该整数转换成字符串,方便遍历每一位

  2. 定义sum,暂时保存每次的结果

  3. 定义m映射,保存每个不同的sum出现的次数,如果超过1则表示陷入死循环

  4. 循环直到sum == 1

  5. 在循环内部:

  6. 遍历字符串,计算sum

  7. 如果sum==1,直接返回false

  8. 如果sum不等于1,增加m[sum]的值

  9. 如果m[sum]>1,陷入死循环,直接返回false

  10. 把sum和str_n重置

  11. 重复上述步骤直到返回

这个方法有很多改进空间,比如可以编写一个函数来专门返回一个数所含各数字的列表,这会带来一定的速度提升。

如果有更好的方法请在评论区提出

This post belongs to Column 「算法专栏」 .

3 comments
latest

  • Miki_Sayaka
    Admin

    临时借用一下这个地方,我想提醒一下站长同学,我们是不是应该考虑一下要求I-D账号的拥有者改一下实名?因为他现在的实名写的是朱斌……

  • Miki_Sayaka
    Admin

    我已经暂时封禁了该用户,当他在线下通知实名后就会放开

  • Deleted Flog User
    Miki_Sayaka:

    我已经暂时封禁了该用户,当他在线下通知实名后就会放开

    可以