LeetCode202--快乐数

题目描述:编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 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;
}

思考:自己虽然把双指针怎么使用想出来了,但是代码这方面,自己第一次尝试些的代码的运行时间过长,思路是对了,但是代码太多于冗长,于是去查看了别人的双指针法,有用函数的,有没有用函数的,但是都很简洁!并且自己学了双指针还是没有学以致用!

猜你喜欢

转载自blog.csdn.net/weixin_44184990/article/details/101457213