[前端]_一起刷leetcode 202. 快乐数

355 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

题目:

202. 快乐数

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

「快乐数」定义为:

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

示例 1:

输入: 19
输出: true
解释: 12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入: n = 2
输出: false

提示:

  • 1 <= n <= 231 - 1

思路:

  • 写一个方法,去计算每一轮的数值平方和的结果(想思路的时候先不用想具体代码的实现,先做好规划)
  • 边界判定,当返回值为1时循环结束
  • 避免无线循环,找出结束的条件 -- 如果这个数字之前出现过,那么就证明已经陷入了无限循环

实现:

/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
  // 用来记录这个数字有没有出现过, 如果出现过就可以结束了
  let set = new Set();
  let cur = n;
  while (!set.has(cur)) {
      set.add(cur);  
      cur = findNext(cur);
      // 结束条件判断
      if (cur === 1) {
          return true;
      }
  }
  return false;
};

// 计算当前数字的快乐数, 游戏规则 每一位数字的平方累加
var findNext = function(number) {
  str = number + ""; // js隐式转换,number转string
  const n = str.length;

  let result = 0;
  for (let i = 0; i < n; i++) {
      let cur = str[i] - 0; // js隐式转换,string转number
      result += Math.pow(cur, 2);
  }

  return result;
}

总结:

这道题目是比较简单的。其中用到的知识点有es6新语法Set和JS的隐式转换,其中es6的Set和Map有点类似于后端语言中的hash哈希表结构,一般设计到hash的题目前端基本用Map代替。

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。