72 lines
1.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
*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;
}