写个简单题水一水!!!
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
题目重点:数字的转换,无限循环的避免
数字转换我们可以使用递归实现,退出无线循环则使用快慢指针(解决链表环)
class Solution {
public:
//递归返回n转换后的数字
int change(int n)
{
if(n==0) return 0;
return pow(n%10,2)+change(n/10);
}
bool isHappy(int n) {
int slow=n;
int fast=n;
while(fast!=1) //slow转换一次 fast转换两次
{
slow=change(slow);
fast=change(fast);
fast=change(fast);
if(fast==slow) break;//快满指针相遇表示存在死循环 则break
}
return fast==1;
}
};
可以看到while循环条件是fast!=1,由于1转换后还是1,所以当转换一次到1的情况也能通过