题目:
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
示例 2:
输入:n = 2 输出:false
解法一:双指针
首先我们应该看到题目说,在变化过程中,数可能会无限循环,用链表的思想,说明会成环,则我们可以使用快慢指针,快指针是慢指针的两倍,如果成环,则表明快慢指针相遇了,此时需要看它们所指的值是否是1,是1则说明是快乐数,不是1就不是快乐数。具体代码如下:
class Solution { public: int bitSquareSum(int n) { int sum = 0; while(n > 0) { int bit = n % 10; sum += bit * bit; n = n / 10; } return sum; } bool isHappy(int n) { int slow = n, fast = n; do{ slow = bitSquareSum(slow); fast = bitSquareSum(fast); fast = bitSquareSum(fast); }while(slow != fast); return slow == 1; } };
解法二:哈希表
我们可以用哈希表存储每次计算到的值,而且每个值都是不重复的,我们只需要存储一个值就可以,所以我们应该unordered_set来存储,如果返回的值可以在哈希表中找到,说明产生了循环,此时看该值是否等于1,等于则是快乐数,不等于就不是快乐数。具体代码如下:
class Solution {
public:
int getSum(int n) {
int sum = 0;
while(n > 0)
{
int bit = n % 10;
sum += bit * bit;
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set;
while(n){
int sum=getSum(n);
if(sum==1){
return true;
}
if(set.find(sum)!=set.end()){
return false;
}else{
set.insert(sum);
}
n=sum;
}
return false;
}
};