快乐数解题
要求:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。
解题思路
一个n位数的number 个位的平方 + 十位的平方 + 百位的平方 + ......
得到一个新的n位数的number
该新的n位数的number又会重复 个位的平方 + 十位的平方 + 百位的平方 + ......
举个例子:2 -> 4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4
举例后不难发现,这就是个环形链表
所以首先定义两个值pre cur ,进行一步走和两步走,进入循环
当cur === pre 或者cur == 1时,跳出循环
最后简单判断一下cur是否==1,根据判断结果返回false/true即可
代码
var isHappy = function (n) {
// pre为n,cur为n.next
let pre = n, cur = getNext(n);
// 当pre与cur不相等,且cur不为1时,继续运算
// 跳出循环的可能有两个:pre===cur、cur==1
while (pre !== cur && cur != 1) {
pre = getNext(pre);
cur = getNext(getNext(cur));
}
return cur === 1
};
/**
* getNext作用:
* 将传进来的值按照快乐数的计算方式处理
* 并且返回处理后的结果
* */
var getNext = function (n) {
// 设置一个参数,存储计算后的值
let t = 0;
// while循环处理传进来的值,当n为0,表示已全部计算完毕,退出循环
while (n) {
// 计算传进来的值的最后一位数的平方
t += (n % 10) * (n % 10);
// 缩小十倍,得到的值准备再次进行while运算
n = Math.floor(n / 10);
}
// 返回计算后的值
return t;
}
/**
* 快乐数:
* 判断一个数是否为快乐数
* 19 -> 1^2 + 9^2 = 1 + 81 = 82
* 82 -> 8^2 + 2^2 = 64 + 4 = 68
* 68 -> 6^2 + 8^2 = 36 + 64 = 100
* 100 -> 1^2 + 0^2 + 0^2 = 1 + 0 + 0 = 1
* 最后结果为1,则为快乐数
*
*
* 要求:
* 编写一个算法来判断一个数 n 是不是快乐数。
* 「快乐数」定义为:
* 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
* 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
* 如果 可以变为 1,那么这个数就是快乐数。
* 如果 n 是快乐数就返回 true ;不是,则返回 false 。
*
* 解题思路:
* 一个n位数的number 个位的平方 + 十位的平方 + 百位的平方 + ......
* 得到一个新的n位数的number
* 该新的n位数的number又会重复 个位的平方 + 十位的平方 + 百位的平方 + ......
* 举个例子:2 -> 4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4
* 举例后不难发现,这就是个环形链表
* 所以首先定义两个值pre cur ,进行一步走和两步走,进入循环
* 当cur === pre 或者cur == 1时,跳出循环
* 最后简单判断一下cur是否==1,根据判断结果返回false/true即可
* */