思路
这里主要是需要熟悉对取值各个位数上的单数操作,也就是数字拆分方法:
- 转化为字符串,使用split方法
// 将数字转换为字符串,以便拆分为单个数字 let arr = ('' + (totalCount || n)).split('');
- 使用数学运算符
let sum = 0; // 初始化 sum 为 0 while (n) { // 当 n 不为 0 时循环 sum += (n % 10) ** 2; // 将 n 的最后一位数字平方后加到 sum 上 n = Math.floor(n / 10); // 去掉 n 的最后一位数字 }
步骤(方法一)
初始化:创建一个空的集合(
Set
),用于存储每个数字的平方和,以检测是否出现循环。计算平方和:将给定的数
n
转换为字符串,然后转换回数字数组,计算每个数字的平方和。循环检测:
- 使用一个
while
循环,条件是未达到快乐数的终点(即平方和不等于 1)。- 在每次循环中,计算当前数字的平方和。
- 如果计算出的平方和已经存在于集合中,说明已经进入循环,因此该数不是快乐数,返回
false
。- 如果平方和不在集合中,则将其添加到集合中,并更新当前数字为计算出的平方和。
检查结果:如果平方和达到 1,则该数是快乐数,返回
true
。结束循环:如果循环正常结束(即没有检测到循环且平方和达到 1),则认为数
n
是快乐数。
题目
示例代码
//方法一
var isHappy = function(n) {
let set = new Set(); // 创建一个Set,用于存储遍历过程中的数字,以便检测循环
let totalCount;
// 开始循环,直到totalCount达到1
while(totalCount !== 1) {
// 如果totalCount未定义,则使用n,否则使用totalCount
// 将数字转换为字符串,以便拆分为单个数字,split返回数组
let arr = ('' + (totalCount || n)).split('');
// 使用reduce方法计算数组arr中所有数字平方的和
// total为累加器,num为当前数字
// 箭头函数:计算每个数字的平方并累加
totalCount = arr.reduce((total, num) => total + num ** 2, 0);
// 如果set中已经存在totalCount,则说明已经出现过这个数字,陷入循环,返回false
if (set.has(totalCount)) {
return false;
}
// 将当前的totalCount添加到set中,用于下一次循环的检测
set.add(totalCount);
}
// 如果循环正常结束,说明最终totalCount达到1,返回true
return true;
};
//方法二
// 定义函数 getSum,用于计算一个数各位数字的平方和
var getSum = function (n) {
let sum = 0; // 初始化 sum 为 0
while (n) { // 当 n 不为 0 时循环
sum += (n % 10) ** 2; // 将 n 的最后一位数字平方后加到 sum 上
n = Math.floor(n / 10); // 去掉 n 的最后一位数字
}
return sum; // 返回各位数字的平方和
};
// 定义函数 isHappy,用于判断一个数是否是快乐数
var isHappy = function(n) {
let set = new Set(); // 创建一个 Set 用于存储遍历过程中的数字,以便检测循环
// 当 n 不是 1 并且 n 还没有出现在 Set 中时循环
while (n !== 1 && !set.has(n)) {
set.add(n); // 将 n 添加到 Set 中
n = getSum(n); // 用 getSum 函数计算 n 的各位数字的平方和,更新 n 的值
}
// 如果 n 等于 1,说明已经找到快乐数,返回 true。否则,说明陷入了循环,返回 false。
return n === 1;
};
欢迎指正!