题目描述:编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
原本写这道题的时候是奔着应用刚学的哈希表的。刚开始看到这道题目的时候,一直在想要怎么才能退出循环呢,如果变不到1的话,去看了评论区的,然后有人有说道双指针的方法,有点不知所以然。因为觉得这是个哈希表标注下的题目,但是题解了很多并没有用C语言来实现哈希表的方法。于是又想回来了这个双指针法,究竟是什么意思呢?什么是双指针呢,自己学双指针是在什么情况下学的?是的,是在解决环形链表的时候呢,这个时候不也是刚好有个环形的循环吗?于是就用这个方法了。
代码:
//计算每个数平方和函数--返回一次计算结果
int sum(int key)
{
int mod;
int sum = 0;
while(key)
{
mod = key % 10;
sum += mod * mod;
key /= 10;
}
return sum;
}
bool isHappy(int n){
int slow = n; //慢指针
int fast = n; //快指针
do{
slow = sum(slow); //慢指针走1部
fast = sum(fast); /./快指针走两步
fast = sum(fast);
if(fast == 1) //判断快指针的效率会更高一点
return true;
}while(slow != fast);
return false;
}
思考:自己虽然把双指针怎么使用想出来了,但是代码这方面,自己第一次尝试些的代码的运行时间过长,思路是对了,但是代码太多于冗长,于是去查看了别人的双指针法,有用函数的,有没有用函数的,但是都很简洁!并且自己学了双指针还是没有学以致用!