题目

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

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

示例:

  1. 输入: 19
  2. 输出: true

解释:

12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

方案一(hash表)

func isHappy(n int) bool {
    m := map[int]bool{} // 出现过该数字
    num := n
    for {
        if _, ok := m[num]; ok {
            return false
        }
        m[num] = true
        num = getSumOfSquare(num)
        if num == 1 {
            return true
        }
    }
}

func getSumOfSquare(num int) int {
    ret := 0
    for num > 0 {
        tail := num % 10
        ret += tail * tail
        num /= 10
    }

    return ret
}

方案二

func isHappy(n int) bool {
    for {
        v := 0
        for ; n > 0; {
            d := n % 10
            v += d * d
            n /= 10
        }
        if v == 1 {
            return true
        }
        if v == 4 { // 如果不是快乐数 最终会出现 4 16 37 58 89 145 42 20 循环
            return false
        }
        n = v
    }
    return false
}

方案三(快慢指针——leetcode题解)

class Solution {
public:
    int bitSquareSum(int n) {
        int sum = 0;
        while(n > 0)
        {
            int bit = n % 10;
            sum += bit * bit;
            n = n / 10;
        }
        return sum;
    }

    bool isHappy(int n) {
        int slow = n, fast = n;
        do {
            slow = bitSquareSum(slow);
            fast = bitSquareSum(fast);
            fast = bitSquareSum(fast);
        } while (slow != fast);

        return slow == 1;
    }
};

使用“快慢指针”思想找出循环

https://leetcode-cn.com/problems/happy-number/solution/shi-yong-kuai-man-zhi-zhen-si-xiang-zhao-chu-xun-h/

原文

https://leetcode-cn.com/explore/learn/card/hash-table/204/practical-application-hash-set/808/