2024年11月21日,每日一记

4 阅读3分钟

算法题

202. 快乐数

题目描述

  1. 将数字各个数位上的数字的乘方相加
  2. 如果结果是1,则该数字和快乐数
  3. 否则不是

解法一

老规矩:自己写的

/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function (n) {
  let res = n;
  let count = 0; // 假设有结果,则100次以内必定会出现结果
  while (res !== 1 && count < 99) {
    res = getSplitResult(res);
    count++;
  }
  return res === 1;
};

/**
 * @param {number} n
 * @return {number}
 */
function getSplitResult(n) {
  if (typeof n !== "number") return;
  const res = (n + "").split("");
  const count = res.reduce((pre, current) => {
    return pre + current * current;
  }, 0);
  return count;
}

解题思路:

  1. 写一个函数,用于返回各个数位的乘方和
  2. 假设一个快乐数100次以内一定可以判断出(我自己想的)
  3. 如果循环次数 < 100 并且 当前结果不是 1,则一直循环
  4. 如果当前数等于1或者循环次数到100次,返回当前数是否等于1

解法二

function getSplitResult(n) {
  if (n == 1 || n == 0) return n;
  let res = 0;
  while (n) {
    res += (n % 10) * (n % 10);
    n = parseInt(n / 10);
  }
  return res;
}

var isHappy = function (n) {
  const sumSet = new Set();
  // 如果sumSet中有,则说明该数的结果 !== 1,直接返回结果
  while (n != 1 && !sumSet.has(n)) {
    // 如果 sumSet中没有,将当前数替换为计算结果,并记录到 sumSet中
    sumSet.add(n);
    n = getSplitResult(n);
  }
  return n == 1;
};

解题思路

  1. 写一个函数,用于返回各个数位的乘方和
  2. 声明一个hash表,记录当前的数据是否计算过,如果计算过,返回计算结果,如果未计算过,计算并保存计算记录
  3. 当所有数据都计算过时,停止循环,并判断结果是否等于1

面试题

JS 中的数据类型有哪些

  1. 基础类型
  2. 复杂类型

基础类型

  1. number
  2. string
  3. boolean
  4. undefined
  5. null
  6. symbol
  7. bigInt

复杂类型

所有的复杂类型本质都是 Object

两个数据的区别

区分

内存地址上看

基础类型存放在栈内存中,栈存放的数据,读取灵活,操作快,长度固定、生命周期短

复杂类型存放在堆内存中,使用灵活,可以嵌套属性,生命周期长

访问方式

基础类型在栈中保存的就是本身的值,只有一次存取周期

复杂类型保存的是内存中的地址,本身是一个地址值,最少有两次存取周期

比较方式

基础类型的比较是内容比较,两个值的内存地址不一样,但是内容一样,则是一样的

复杂类型比较是内存中的地址值,即两个元素内存地址一样,则相等,如果内容一样,但是内存地址不一样,则不一样

添加属性

基础类型因为本身只存放内容,所以不存在属性的说法,无法为基础类型的值添加属性

复杂类型的值本身是内存地址,是对象,所以存在属性的概念可以动态的分配属性

变量赋值

基础类型如果使用等号进行赋值时,是重新声明一个栈内存,并将当前的值复制一份到新的内存中

复杂类型赋值时赋值的是内存地址,即重新声明一块堆内存地址,并将复制对象的地址保存到新声明的内存中