2024年11月22日,每日一记

32 阅读1分钟

算法题

1. 两数之和

题目描述

两数之和

小记:强者在于把简单的事情做好作精

解法一:暴力穷举

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j];
      }
    }
  }
};

解题思路

  1. 双层循环遍历

优点

  1. 简单,容易理解
  2. 内存使用量较低

缺点

  1. 时间复杂度高

解法二:hash表

还是第一次自己写出来时间复杂度排名前2的代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  const mapHash = {};
  for (let i = 0; i < nums.length; i++) {
    let val = nums[i];
    if (mapHash[val] !== undefined) {
      return [i, mapHash[val]];
    } else {
      mapHash[target - val] = i;
    }
  }
};

解题思路

  1. 单层循环+hash表缓存结果
  2. 缓存的值为 target - 当前值 的值,减少取数、判定的读取时间
  3. 单层循环将复杂度减少到O(n)

面试题

包装类型

先看一小段代码

const str = "abc"
console.log(abc.length)

有没有好奇怪过为什么,我们没有给字符串添加过length的属性,但是创建的字符串会自带length的属性

因为str实际是js包裹过一层的对象,不是直接的 "abc"

这里的str 可以理解为 new String("abc")

str 本质是一个字符串对象,类似于以下操作

const str = "abc"
console.log(abc.length)
{
    const _str = new String("abc")
    console.log(_str.length)
    _str = null
}

包装类型的作用就是帮助我们快速的操作对象,更简单更方便