
js
/**
* @param {number} n
* @return {boolean}
*/
function isHappy(n) {
// 接收一个数字,计算这个数字每一位上的数字的平方和,并返回这个平方和。
function getNext(number) {
let totalSum = 0 // 初始化平方和为0
// 循环拆解数字的每一位(直到数字被拆解完,变为0)
while (number > 0) {
// 取当前数字的最后一位(余数)
const digit = number % 10
// 去掉最后一位,更新数字(整除10)
number = Math.floor(number / 10)
// 累加当前位的平方到总和中
totalSum += digit * digit
}
// 返回计算得到的平方和
return totalSum
}
// 慢指针:初始指向输入数字n,每次只走一步(计算一次平方和)
let slowRunner = n
// 快指针:初始指向n的下一个平方和,每次走两步(连续计算两次平方和)
let fastRunner = getNext(n)
// 循环条件:
// 1. 快指针未到达1(到达1说明是快乐数,可终止循环)
// 2. 慢指针和快指针未相遇(相遇说明进入循环,不是快乐数)
while (fastRunner !== 1 && slowRunner !== fastRunner) {
// 慢指针走一步:计算一次平方和
slowRunner = getNext(slowRunner)
// 快指针走两步:连续计算两次平方和
fastRunner = getNext(getNext(fastRunner))
}
// 最终判断:如果快指针等于1,说明是快乐数;否则不是
return fastRunner === 1
}