简单点说,就是将一个整数每一位上的数拆开,19—1,9,再分别对拆开的数求平方,求和得到新的数,直到得到1则返回true,若得到的新数在前面出现过,则返回false。
自己写了个runtime = 261ms的算法,后来又看到一个更高明的解法,一起记录下来。
public class Solution { //runtime = 261ms
public boolean isHappy(int n) {
int b[] = new int[20];
int j = 0;
while (true){
int k = 0;
int num = 0;
while (n > 0){
num += (int)(Math.pow(n % 10, 2));
n /= 10;
}
b[j] = num;
if (num == 1){
return true;
}
while (k < j && (b[k] != num)){
k ++;
}
if (k == j){
n = num;
j ++;
}
else {
return false;
}
}
}
}
之所以说下面这个方法高明,是因为考虑到要判断当前有没有出现过,也即判断加入时是否会重复,导致不能加入的情况,这样显然就可以利用集合set,因为set的重要性质就是元素无序,且不能重复。
public class Solution {
<span style="color:#ff0000;">private Set<Integer> set = new HashSet<Integer>() {{ add(0); }};</span>
public boolean isHappy(int n) {
if (n == 1){
return true;
}
if (!set.add(n)){
return false;
}
int num = 0;
while (n > 0){
num += (int)(Math.pow(n % 10, 2));
n /= 10;
}
return isHappy(num);
}
}