快乐数

原题:

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 true ;不是,则返回 false

示例 1:

  1. 输入:19
  2. 输出:true
  3. 解释:
  4. 12 + 92 = 82
  5. 82 + 22 = 68
  6. 62 + 82 = 100
  7. 12 + 02 + 02 = 1

示例 2:

  1. 输入:n = 2
  2. 输出:false

提示:

  • 1 <= n <= 231 - 1

解题方法:

解法一:

  1. class Solution {
  2. public:
  3. bool isHappy(int n) {
  4. long long temp = 0, res = 0;
  5. unordered_set<int> visited;
  6. while (visited.count(n)==0)
  7. {
  8. visited.emplace(n);
  9. res = 0;
  10. while (n > 0)
  11. {
  12. temp = (long long)n % 10;
  13. n = n / 10;
  14. res += temp * temp;
  15. }
  16. if (res == 1)
  17. {
  18. return true;
  19. }
  20. n = res;
  21. }
  22. return false;
  23. }
  24. };

解法二:

  1. class Solution {
  2. public:
  3. int bitSquareSum(int n) {
  4. int sum = 0;
  5. while(n > 0)
  6. {
  7. int bit = n % 10;
  8. sum += bit * bit;
  9. n = n / 10;
  10. }
  11. return sum;
  12. }
  13. bool isHappy(int n) {
  14. int slow = n, fast = n;
  15. do{
  16. slow = bitSquareSum(slow);
  17. fast = bitSquareSum(fast);
  18. fast = bitSquareSum(fast);
  19. }while(slow != fast);
  20. return slow == 1;
  21. }
  22. };

做题小结:

针对解法一:

  1. 重点在于如何判断该数在进行无限循环,此处使用了一个哈希表,如果出现了已经被计算过的数,那么说明进入了循环,就要返回false

针对解法二:

  1. 使用快慢指针来检测循环