202. 快乐数
哈希表(set)
思路
将每次循环计算得到的数加入哈希表(set) set1 中,加入前判断这个数是否已存在于 set1 中,
若存在,说明出现了循环,不是快乐数,返回 false;
若不存在,将计算得到的数加入哈希表(set) set1 中。
当计算得到的数等于1时,说明是快乐数,退出 while 循环,返回 true。
import java.util.Set;
import java.util.HashSet;
class Solution {
public boolean isHappy(int n) {
// 将每次计算得到的数加入到 set1 中
Set<Integer> set1 = new HashSet<>();
while (n != 1) { // 若 n = 1,说明原始的数是快乐数
if (set1.contains(n)) { // 若 n 已存在 set1 中,出现循环,返回 false
return false;
} else {
set1.add(n);
n = getSum(n);
}
}
return true;
}
// 返回整数 n 各位数字的平方和
public int getSum(int n) {
int sum = 0;
while (n != 0) {
sum += Math.pow(n % 10, 2);
n /= 10;
}
return sum;
}
}
待解决
本题解法时间复杂度的计算:
快慢指针
思路
如果不是快乐数,一定出现循环,将计算得出的每个数连接起来,形成一个环形链表。
初始,slow = n,fast = getNextNum(n)。
每次循环,slow = getNextNum(slow) 走一步,fast = getNextNum(getNextNum(fast)) 走两步,若 slow = fast ,存在环,返回 false。
fast = 1,退出循环,返回 true。
class Solution {
public boolean isHappy(int n) {
int slow = n;
int fast = getNext(n);
while (fast != 1 && fast != slow) {
slow = getNext(slow);
fast = getNext(getNext(fast));
}
return fast == 1;
}
public int getNext(int n ) {
int totalSum = 0;
while (n > 0) {
int d = n % 10;
n = n / 10;
totalSum += d * d;
}
return totalSum;
}
}