编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
分析:
1.把输入的数字拆分为单个数字并保存起来,然后一个一个的判断是不是等于1,等于1就返回true
class Solution {
public:
bool isHappy(int n) {
int curr = n;
int max = 100;
int count = 0;
do{
curr = split(curr);
if(curr == 1)
return true;
count ++;
}while(curr != n && count < max);
return false;
}
// 返回每个数字的平方和
int split(int num){
vector<int> result;
while(num != 0){
result.push_back(num%10);
num /= 10;
}
int sum = 0;
for(int i:result)
sum += i*i;
return sum;
}
};
但是上述代码过于费时,因为一个不是快乐数的数需要判断max次,执行耗时20ms,下面是利用map做的一个改进,耗时4ms
class Solution {
public:
bool isHappy(int n) {
// 保存以前出现过的数字
map<int,int> mp_temp;
int curr = n;
do{
curr = split(curr);
if(curr == 1)
return true;
// 查找以前是不是出现过这个数字
// 出现过就说明进入到了循环
mp_temp[curr] ++;
if(mp_temp[curr] == 2)
return false;
}while(curr != n);
return false;
}
// 返回每个数字的平方和
int split(int num){
vector<int> result;
while(num != 0){
result.push_back(num%10);
num /= 10;
}
int sum = 0;
for(int i:result)
sum += i*i;
return sum;
}
};