编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
正解:
大致的思路就是逐渐拆分判断,符合递归的思想;关键点就是是否为无线循环的情况,所以需要一个Set集合记录拆分得到的每一个数字和,并判断是否出现过
class Solution {
public static boolean isHappy(int n) {
Set set = new HashSet();
int temp = n;
String str = null;
boolean flag = false;
return Happy(set, temp, flag, str);
}
public static boolean Happy(Set set, int temp, boolean flag, String str) {
set.add(temp);
str = String.valueOf(temp);
temp = 0;
for (int i = 0; i < str.length(); i++) {
temp += (str.charAt(i) - '0') * (str.charAt(i) - '0');
}
if (temp == 1) {
flag = true;
return flag;
} else if (!set.contains(temp)) {
flag=Happy( set, temp, flag, str);
}
return flag;
}
}
或者:
class Solution {
Set set = new HashSet();
int temp;
String str;
boolean flag=false;
public boolean isHappy(int n) {
set.add(n);
str=String.valueOf(n);
temp=0;
for (int i = 0; i < str.length(); i++) {
temp+=(str.charAt(i)-'0')*(str.charAt(i)-'0');
}
if (temp==1){
flag=true;
}else if(!set.contains(temp)){
flag=isHappy(temp);
}
return flag;
}
}
下面记录一个在提交时的一个注意点:
源码是这样的:
class Solution {
static Set set = new HashSet();
static int temp;
static String str;
static boolean flag=false;
public static boolean isHappy(int n) {
set.add(n);
str=String.valueOf(n);
temp=0;
for (int i = 0; i < str.length(); i++) {
temp+=(str.charAt(i)-'0')*(str.charAt(i)-'0');
}
if (temp==1){
flag=true;
}else if(!set.contains(temp)){
flag=isHappy(temp);
}
return flag;
}
}
如图我们在单个测试样例:2,是正确的;但提交测试却是错误的。
原因在于:
我们在编写代码时,有时为了可以在idea的main方法测试,可能会加入static关键字;由于static静态变量优先加载且只加载一次的特性,所以leedcode在测试时是一次性测试,这样就导致了static Set中会记录之前样例的所有结果而不会在每次测试用例时重新加载;导致了这样的报错。