Leetcode202-快乐数

Leetcode202-快乐数

编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false 。

示例:

输入:19
输出:true
解释:
1**2 + 9**2 = 82
8**2 + 2**2 = 68
6**2 + 8**2 = 100
1**2 + 0**2 + 0**2 = 1
本题的要点在于检测无限循环。判断一个数是不是快乐数时会反复计算每个出现的数字的各个数位的平方和。如果一个数被计算了两次,这意味着无限循环,
即输入的数永远不可能变为1了。因此我们可以通过哈希集来保存计算过程中每个出现的数字,如果检测到一个数字出现了两次就返回false。
无限循环
 1 var bitSum = function (n) {
 2     res = 0;
 3     while (n > 0) {
 4         bit = n % 10;
 5         res += bit * bit;
 6         n = parseInt(n / 10);
 7     }
 8     return parseInt(res);
 9 }
10 
11 var isHappy = function(n) {
12     if (n == 1) {
13         return true;
14     }
15 
16     numSet = new Set();
17     while (n != 1) {
18         tempSum = bitSum(n);
19         if(numSet.has(tempSum)) {
20             return false;
21         } else {
22             if (tempSum == 1) {
23                 return true;
24             } else {
25                 numSet.add(tempSum);
26                 n = tempSum;
27             }
28         }
29     }
30 };

 在计算一个数字的各个数位的平方和时,会用到除法和乘法运算,做这道题时要注意把除法和乘法的结果转为整数。由于JavaScript的number类型是浮点型的,因此其算术运算存在误差。在本题中,如果不将浮点数转换为整数可能会导致死循环和错误的结果。

posted @ 2021-04-09 15:52  曹冲字仓舒  阅读(76)  评论(0)    收藏  举报