初步接触快乐数&快乐数简单解题

273 阅读3分钟

快乐数解题

要求:

编写一个算法来判断一个数 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即可
 * */