leetcode 202.快乐数
题目描述
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
解题思路
1.快慢指针
首先根据快乐数的定义,先自己寻找规律,可以知道,在寻找快乐数的过程中,是一个数字循环的过程,如果是快乐数,那最后就会一直循环数字1,如果不是,就会几个数字进行不断的循环,那么就可以使用快慢指针的思路,当快指针追上慢指针的时候,判断是否为1即可。
class Solution {
public:
bool isHappy(int n) {
// 小于零直接返回false
if(n<=0){
return false;
}
// 定义快慢指针
int slow = n;
int fast = n;
fast = sumEachBit(n);
while(fast != slow){
slow = sumEachBit(slow);
fast = sumEachBit(fast);
fast = sumEachBit(fast);
}
// 判断相遇时的数字是否为1
if(slow == 1){
return true;
}
return false;
}
// 计算数字每一位相加之和
int sumEachBit(int num){
int sum = 0;
while(num){
int mod = num%10;
num /= 10;
sum += mod*mod;
}
return sum;
}
};
2.哈希映射
把每次相加得到的数字存入哈希表中,判断下一个相加的得到的数字是否在表中,如果存在并且不为1,直接返回false。
class Solution {
public:
bool isHappy(int n) {
// 非正数直接返回false
if(n<=0){
return false;
}
unordered_map<int, bool> map; // 定义一个哈希表
while(n > 0){
int temp = sumEachBit(n); // 计算数字每一位相加的和
if(temp == 1){ // 判断是否为1
return true;
}
else{ // 进一步的添加到map中
if(map[temp] == true){
break;
}
else{
map[temp] = true;
}
}
n = temp; // temp的如果太大会越界变成负数,所以while循环条件是n>0
}
return false;
}
// 计算数字每一位相加之和
int sumEachBit(int num){
int sum = 0;
while(num){
int mod = num%10;
num /= 10;
sum += mod*mod;
}
return sum;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步