202. 快乐数

我快乐尼玛币!
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果 可以变为 1,那么这个数就是快乐数。
  1. //哈希法,时空都是logN
  2. func isHappy(n int) bool {
  3. // 负数要管???
  4. // 记录数是否存在过
  5. his := make(map[int]bool)
  6. flag := false
  7. // 数不存在过
  8. for his[n] == false {
  9. his[n] = true
  10. fmt.Println(n)
  11. // 平方和
  12. square := 0
  13. for n > 0 {
  14. // 得到最小数
  15. digit := n%10
  16. square += digit * digit
  17. // 降级
  18. n = n/10
  19. }
  20. if square == 1 {
  21. flag = true
  22. break
  23. }
  24. n = square
  25. }
  26. return flag
  27. }
//快慢指针法,判断有环
func isHappy(n int) bool {
    slow, fast := n, step(n)
    for fast != 1 && slow != fast {
        slow = step(slow)
        fast = step(step(fast))
    }
    return fast == 1
}

func step(n int) int {
    sum := 0
    for n >0 {
        sum += (n%10) * (n%10)
        n = n/10
    }
    return sum
}