编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
思考:
对于这道题我们只需按照题意每一次将该数替换为它每个位置上的数字的平方和并判断结果是否等于1如果等于1则n为快乐数否则继续循环,循环的终止条件在于题目上的无限循环表明如果一个数不是快乐数那么它在后面的循环中是会重复出现之前的数字的所以每次我们得到平方和如果set中没有平方和的这个数则添加至set中否则直接返回false也就表明n不是快乐数;
我的解法(时间复杂度O(N))
class Solution {
public boolean isHappy(int n) {
Set<Integer> set=new HashSet();
int sum=0;
while(true){
String numString=Integer.toString(n);
int len=numString.length();
for(int i=0;i<len;i++){
int num=numString.charAt(i)-'0';
sum+=num*num;
}
if(!set.contains(sum))
set.add(sum);
else return false;
if(sum==1) return true;
n=sum;
sum=0;
}
}
}
优质解法(时间复杂度O(logn))
class Solution {
public boolean isHappy(int n) {
Set<Integer> record = new HashSet<>();
while (n != 1 && !record.contains(n)) {
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n) {
int res = 0;
while (n > 0) {
int temp = n % 10;
res += temp * temp;
n = n / 10;
}
return res;
}
}