手写实现

合并区间

var merge = function(intervals) {
    intervals.sort((p, q) => p[0] - q[0]); // 按照左端点从小到大排序
    const ans = [];
    for (const p of intervals) {
        const m = ans.length;
        if (m && p[0] <= ans[m - 1][1]) { // 可以合并
            ans[m - 1][1] = Math.max(ans[m - 1][1], p[1]); // 更新右端点最大值
        } else { // 不相交,无法合并
            ans.push(p); // 新的合并区间
        }
    }
    return ans;
};

Promise.finally

Promise.prototype.finally = function (callback) {
  return this.then((data) => {
    return Promise.resolve(callback()).then(() => data); // data 上一个promise的成功态
  }, err => {
    return Promise.resolve(callback()).then(() => {
      throw err; // 把之前的失败的err,抛出去
    });
  })
}

接雨水

无重复最大子串

三数之和

翻转列表(part)

防抖

事件触发 n 秒后再执行回调,如果在 n 秒内又被触发,则重新计时

常见场景:

  • 搜索框输入

  • 手机号、邮箱验证的检测

  • 窗口 Resize,只有大小调整好后,再重新计算渲染

节流

防抖可能会产生“饥饿“问题,节流类似于给函数赋予一个 CD,一次函数执行后的一定时间内不能再被触发

常见场景

  • 高频次提交,表单重复提交

  • 滚动加载

浅拷贝 & 深拷贝

浅拷贝

浅拷贝只复制第一层,使用 Object.assign() 可以实现

深拷贝

  1. JSON.stringify(), JSON.parse()

  2. 递归实现

获取页面 URL

image-20220328162150094

交集 并集 差集

千分位数字

判断对象是否为空

传入 [1,[[2],3,4],5] ,返回 [1,2,3,4,5]

16 进制转 rgb

实现 sleep

生成 N 个范围在 (min, max) 中的数

拆分查询参数

去掉字符串前后的空格

三数之和,双指针

环形链表

二叉树公共祖先

层序构建二叉树

快排

归并排序

ES5 继承

异步加法

手写 new

手写实现 bind

Last updated