题目地址:
https://www.lintcode.com/problem/happy-number/description
给定一个正整数 ,求其各位数之平方和,得出新数,再不停对这个新数做同样操作。如果最终得到了 ,则返回true,其余情况则返回false。
法1:用哈希表记录算出来的数,如果有重复则返回false。如果中途得到了 则返回true。代码如下:
import java.util.HashSet;
import java.util.Set;
public class Solution {
/**
* @param n: An integer
* @return: true if this is a happy number or false
*/
public boolean isHappy(int n) {
// write your code here
Set<Integer> set = new HashSet<>();
set.add(n);
int i = 0;
while ((i = sum(n)) != 1) {
if (!set.add(i)) {
return false;
}
n = i;
}
return true;
}
private int sum(int n) {
int res = 0;
while (n > 0) {
int i = n % 10;
res += i * i;
n /= 10;
}
return res;
}
}
法2:用链表求环的办法,快慢指针。
public class Solution {
public boolean isHappy(int n) {
// write your code here
int slow = n, fast = n;
do {
slow = sum(slow);
fast = sum(sum(fast));
if (fast == 1) {
return true;
}
} while (slow != fast);
return false;
}
private int sum(int n) {
int res = 0;
while (n > 0) {
int i = n % 10;
res += i * i;
n /= 10;
}
return res;
}
}