算法题
题目描述
两数之和
小记:强者在于把简单的事情做好作精
解法一:暴力穷举
/**
* @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];
}
}
}
};
解题思路
- 双层循环遍历
优点
- 简单,容易理解
- 内存使用量较低
缺点
- 时间复杂度高
解法二: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;
}
}
};
解题思路
- 单层循环+hash表缓存结果
- 缓存的值为 target - 当前值 的值,减少取数、判定的读取时间
- 单层循环将复杂度减少到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
}
包装类型的作用就是帮助我们快速的操作对象,更简单更方便