题目描述:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
来源:力扣(LeetCode)
思路:
1)这道题每次要计算一个新的值,用到循环;
计算每个位数上的数的和等,用到了循环!需要掌握!
int getNextNum(int n){
int temp = 0;
while(n > 0){
int num = n % 10;
temp = temp + num * num;
n = n / 10;
}
return temp;
}
2)快慢指针,循环链表!
代码:
1)哈希表
class Solution {
public boolean isHappy(int n) {
//判断是否是
Set<Integer> set = new HashSet<>();
//只要当前的数字不是1,就继续循环
while(n != 1){
//循环中,出现了无限循环,就不是快乐数
//无限循环很难界定
if(set.contains(n)){
return false;
}
//加近set中供下次判断
set.add(n);
n = getNextNum(n);
}
return true;
}
//拿到下一个数,也就是不停的更新数字
int getNextNum(int n){
int temp = 0;
while(n > 0){
//每次拿到个位
int num = n % 10;
temp = temp + num * num;
//舍掉个位数
n = n / 10;
}
return temp;
}
}
2)双指针,循环链表
class Solution {
public boolean isHappy(int n) {
//只要出现了相同的数字,且不是1,就会重复路径再次出现,无限循环
//在观感上类似于 上一章的循环链
//fast出发的位置随意?
int fast = getNextNum(n);
int slow = n;
while(fast != 1 && slow != fast){
slow = getNextNum(slow);
fast = getNextNum(getNextNum(fast));
}
return fast == 1;
}
//拿到下一个数,也就是不停的更新数字
int getNextNum(int n){
int temp = 0;
while(n > 0){
//每次拿到个位
int num = n % 10;
temp = temp + num * num;
//舍掉个位数
n = n / 10;
}
return temp;
}
}