快乐数
编写一个算法来判断一个数 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 }
思路:
-
首先把该整数转换成字符串,方便遍历每一位
-
定义sum,暂时保存每次的结果
-
定义m映射,保存每个不同的sum出现的次数,如果超过1则表示陷入死循环
-
循环直到sum == 1
-
在循环内部:
-
遍历字符串,计算sum
-
如果sum==1,直接返回false
-
如果sum不等于1,增加m[sum]的值
-
如果m[sum]>1,陷入死循环,直接返回false
-
把sum和str_n重置
-
重复上述步骤直到返回
这个方法有很多改进空间,比如可以编写一个函数来专门返回一个数所含各数字的列表,这会带来一定的速度提升。
如果有更好的方法请在评论区提出
This post belongs to Column 「算法专栏」 .
Miki_Sayaka
Admin 2021-06-04T13:42:05Z临时借用一下这个地方,我想提醒一下站长同学,我们是不是应该考虑一下要求I-D账号的拥有者改一下实名?因为他现在的实名写的是朱斌……
Miki_Sayaka
Admin 2021-06-04T13:42:59Z我已经暂时封禁了该用户,当他在线下通知实名后就会放开
Deleted Flog User
2021-06-05T01:04:19Z我已经暂时封禁了该用户,当他在线下通知实名后就会放开
可以