快乐数

描述

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

样例
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

答案
public class Solution {
    private List<Integer> results = new ArrayList<>();

    /**
     * @param n an integer
     * @return true if this is a happy number or false
     */
    public boolean isHappy(int n) {
        // Write your code here
        return getSum(n);
    }


    public boolean getSum(int n) {
        results.add(n);
        int sum = 0;
        List<Integer> tmps = splitNum(n);
        for (Integer tmp : tmps) {
            sum += tmp * tmp;
        }
        if (sum == 1)
            return true;
        if (results.contains(sum))
            return false;
        return getSum(sum);
    }

    public List<Integer> splitNum(int n) {
        List<Integer> ns = new ArrayList<>();
        while (n / 10 != 0) {
            ns.add(n % 10);
            n /= 10;
        }
        ns.add(n % 10);
        return ns;
    }
}
考察点
  • 拆分数字成为数字或者List
  • 判断平方和为1(简单)
  • 如何判断已经循环
    • 当平方和重复出现了(比下面的判断条件多一次运算,但是简单)
    • 当拆分的数字位数与数字重复出现了(最优、但是比较难判断)
  • 递归算法
    • 结束条件
  • 每一方法有需要测试语句