/** *https://leetcode.cn/problems/happy-number/?envType=study-plan-v2&envId=top-interview-150 * @param {number} n * @return {boolean} */ const isHappy = function (n) { }; /* 根据快乐数的定义我们只需一直计数,把计数的结果放到Set中,如果在后续的计数中,出现了这个结果说明它不是快乐数(不能是1,所以要先 检测它是否是1,如果是的话就返回) */ function f1(n) { // 使用set来记录出现过的数字 const seen = new Set(); // 循环直到满足条件 while (n !== 1) { // 如果当前数字之前的某次计算出过,说明进入循环 if (seen.has(n)) return false; // 将当前数字加入set seen.add(n); // 计算当前数字的每个位置的平方和 // n = n.toString().split('').reduce((sum, digit) => sum + Number(digit) ** 2, 0); // 优化:通过取余和除法运算计算每一位的平方和 let sum = 0; while (n > 0) { const digit = n % 10; sum += digit * digit; n = Math.floor(n / 10); } n = sum; } return true; } /* 利用弗洛伊德环形检测算法 */ function f2(n) { let slow = n; // 慢指针 let fast = n; // 快指针 // 快慢指针循环 while (fast !== 1 && getSumOfSquares(fast) !== 1) { // getSumOfSquares(fast) !== 1直接提前判定慢指针 slow = getSumOfSquares(slow); fast = getSumOfSquares(getSumOfSquares(fast)); if (slow === fast) { // 如果快慢指针相遇,说明出现了循环 return false; } } return true; } /** * * @param {number} num 要计算各位平方和的数 * @returns 返回计算平方和的数 */ function getSumOfSquares(num) { let sum = 0; while (num > 0) { const digit = num % 10; sum += digit * digit; num = Math.floor(num / 10); } return sum; }