题目
编写一个算法来判断一个数 n 是不是快乐数。
题解
第一种
函数 isHappy 接收一个正整数 n,首先将 n 赋值给变量 low,将 chgNumb(n) 的结果赋值给变量 fast。然后进入一个 while 循环,判断 fast 是否等于 1 或者 low 是否等于 fast 的平方和。如果不满足条件,则将 low 的值更新为 chgNumb(low),将 fast 的值更新为 chgNumb(chgNumb(fast))。其中 chgNumb 函数的作用是将一个数字的每个位上的数字平方后相加,得到的结果,循环结束后,如果 fast 等于 1,则说明 n 是快乐数,返回 true,否则返回 false
var isHappy = function (n) { var low = n; var fast = chgNumb(n); while (fast != 1 && low != fast) { low = chgNumb(low); fast = chgNumb(chgNumb(fast)); } return fast === 1; }; function chgNumb(numb) { var sum = 0; while (numb > 0) { sum = sum + (numb % 10) * (numb % 10); numb = Math.floor(numb / 10); } return sum; }
第二种
我们先初始化一个空的哈希表map,然后使用while循环,判断当前数字n是否等于1,如果是,则返回true,表示该数是快乐数。如果不是,则进行下一步操作,判断当前数字n是否已经在哈希表map中出现过,如果是,则说明出现了循环,返回false,表示该数不是快乐数。如果没有出现过,则将该数字添加到哈希表map中,将当前数字n转换成字符串,再将字符串按位拆分成数组arr,初始化一个变量temp,用于记录数字每个位数的平方和,遍历数组arr,计算每个位数的平方,并将平方结果加到temp中,将temp赋值给n,进入下一轮循环,最终,如果函数执行完while循环后还没有返回true或false,说明出现了异常,可以返回false,表示该数不是快乐数
var isHappy = function (n) { let map = {}; while (n !== 1) { let temp = 0; if (map[n]) return false; map[n] = 1; const arr = String(n).split(""); for (let i = 0; i < arr.length; i++) { temp += parseInt(arr[i]) * parseInt(arr[i]); } n = temp; } return true; };