72 lines
1.8 KiB
JavaScript
72 lines
1.8 KiB
JavaScript
/**
|
||
*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;
|
||
}
|