从零开始的算法生活 - 双指针篇 (二)

一、题目解析

本题选自. - 力扣(LeetCode)


本题要求对于输入的n,将n的每一位平方并累和并将累和值替换掉原来的n,最后判断n是否为1,如果为1则是快乐数,反之则不是快乐数。重复上述操作。

二、讲解算法原理

由于题意可知该题的最后要么n变为1,要么n一直循环始终不为1。所以我们可以将该题抽象的看为成环问题。在学习链表的时候,我们可能碰到过一种情况就是链表成环,也就是判断链表是否成环。在解决链表成环问题时,我们通常用快慢双指针的思想:在链表中我们定义两个指针,慢指针我们每次移动一步快指针每回移动两步,最终如果两个指针相遇则代表该链表成环。而我们本题就可以沿用这种思想只需判断在两个指针相遇时是否为1即可。

我们可以先定义一个函数bitsum(n),用于返回n的每位平方之和

并定义两个指针:slowfast。slow初始指向n,而fast初始指向bitsum(n)

而在一个循环中,若slow未遇到fast,则slow向前一步,fast向前两步。

也就是slow = bitsum(slowfast = bitsum(bitsum(fast))

最终如果slowfast相遇则退出循环,并判断slowfast是否为1,若为1则返回true,反之返回flase

最后本题代码如下:

bool isHappy(int n) {
    int slow = n;
    int fast = bitsum(n);
    while(slow!=fast){
        slow = bitsum(slow);
        fast = bitsum(bitsum(fast));
    }
    return slow == 1;
}

int bitsum(int n){
    int sum = 0;
    while(n){
        int t = n%10;
        sum += t*t;
        n=n/10;
    }

return sum;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值