快乐数
原题:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。
示例 1:
输入:19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1
示例 2:
输入:n = 2输出:false
提示:
1 <= n <= 231 - 1
解题方法:
解法一:
class Solution {public:bool isHappy(int n) {long long temp = 0, res = 0;unordered_set<int> visited;while (visited.count(n)==0){visited.emplace(n);res = 0;while (n > 0){temp = (long long)n % 10;n = n / 10;res += temp * temp;}if (res == 1){return true;}n = res;}return false;}};
解法二:
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;}};
做题小结:
针对解法一:
- 重点在于如何判断该数在进行无限循环,此处使用了一个哈希表,如果出现了已经被计算过的数,那么说明进入了循环,就要返回false
针对解法二:
- 使用快慢指针来检测循环
