快乐数
描述
写一个算法来判断一个数是不是"快乐数"。
一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为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(简单)
- 如何判断已经循环
- 当平方和重复出现了(比下面的判断条件多一次运算,但是简单)
- 当拆分的数字位数与数字重复出现了(最优、但是比较难判断)
- 递归算法
- 结束条件
- 每一方法有需要测试语句