一、题目解析
本题选自:. - 力扣(LeetCode)
本题要求对于输入的n,将n的每一位平方并累和并将累和值替换掉原来的n,最后判断n是否为1,如果为1则是快乐数,反之则不是快乐数。重复上述操作。
二、讲解算法原理
由于题意可知该题的最后要么n变为1,要么n一直循环始终不为1。所以我们可以将该题抽象的看为成环问题。在学习链表的时候,我们可能碰到过一种情况就是链表成环,也就是判断链表是否成环。在解决链表成环问题时,我们通常用快慢双指针的思想:在链表中我们定义两个指针,慢指针我们每次移动一步而快指针每回移动两步,最终如果两个指针相遇则代表该链表成环。而我们本题就可以沿用这种思想只需判断在两个指针相遇时是否为1即可。
我们可以先定义一个函数bitsum(n),用于返回n的每位平方之和。
并定义两个指针:slow和fast。slow初始指向n,而fast初始指向bitsum(n)。
而在一个循环中,若slow未遇到fast,则slow向前一步,fast向前两步。
也就是slow = bitsum(slow), fast = bitsum(bitsum(fast))
最终如果slow与fast相遇则退出循环,并判断slow或fast是否为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;
}