前端算法小白攻略3-leetcode快乐数

226 阅读2分钟

前言

学习了环形链表的抽象概念后,我们来搞个环形链表的应用题,求个快乐数你不快乐吗

逻辑解析

题目: 编写一个算法来判断一个数 n 是不是快乐数。

什么样叫快乐数呢?

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为  1,那么这个数就是快乐数。

  1. 平方和最终变为1意味什么 =》 求和到了终点 =》 理解链表终点指向了null
  2. 无限循环始终变不到1意味什么 =》 求和的结果在循环 =》 链表有环可以无限奔跑
  3. 那么理解为链表我们能做什么? =》 利用快慢指针求解链表有无环的过程就是判定快乐数的过程,无环则说明是快乐数,有环则不是。

开始解题

模拟快慢指针 1次求平方和的过程就相当于跑得慢的甲1步一个节点,2次求和相当于跑得快的乙1步两个节点
判断有无环

var isHappy = function(n) {

  let pre = getNext(n),cur = getNext(getNext(n));

  while(pre != cur) {

      pre = getNext(pre); // 相当于甲1步1节点,getNext的求和方法就相当于next指针

      cur = getNext(getNext(cur)); // 相当于乙1步2节点

  }

  return pre == 1; // pre和cur相等除了等于1之外是快乐数,等于其他值都说明链表有环

};

求和方法

var getNext = function(n) {

    let sum = 0;

    let t = n;

    while(t) {

        sum += (t%10)*(t%10); // 每次对10取余数拿到个位数的平方和

        t = Math.floor(t/10); // 每次求和之后让正整数t缩小10倍向下取整,让原本的10位数变为下一次求和的个位数,依次类推

    }

    return sum;

}