记忆中常考手写题

1.柯里化

function argsSum(args) {
  return args.reduce((pre, cur) => {
    return pre + cur
  })
}
function add(...args1) {
  let sum1 = argsSum(args1)
  let fn = function (...args2) {
    let sum2 = argsSum(args2)
    return add(sum1 + sum2)
  }
  fn.toString = function () {
    return sum1
  }
  return fn
}

2.手写 instanceof

思路:a 沿着原型链找到 b.prototype,则 a instanceof b = true,遍历 a 的原型链,找到 b.prototype,返回 true,否则返回 false

const my_instanceof = (A, B) => {
  let p = A //指针指向a
  while (p) {
    //遍历原型链
    if (p === B.prototype) {
      return true
    }
    p = p.__proto__
  }
  return false
}

3.深克隆

function clone(data) {
  if (typeof data === 'symbol') {
    //symbol,symbol是非object的基本类型
    return Symbol().for(data.description)
  } else if (typeof data != 'object') {
    //基本类型
    return data
  } else if (data instanceof Array) {
    // Array
    return data.map(i => clone(i))
  } else if (data.constructor === Object) {
    //避免 new Date,处理json
    let res = {}
    for (let key in data) {
      res[key] = clone(data[key])
    }
    return res
  } else {
    //系统对象及自定义对象 类似于class
    return new data.constructor(data)
  }
}

4.手写bind

function _bind(asThis) {
  var fn = this //记录this
  var args = slice.call(arguments, 1)
  if (typeof fn != 'function') {
    throw new Error('bind需使用在函数上')
  }
  function resFn() {
    var args2 = slice.call(arguments, 0)
    return fn.apply(
      resFn.prototype.isPrototypeOf(this) ? this : asThis,
      args.concat(args2))
  }
  resFn.prototype = fn.prototype 
  return resFn
}

5.手写new

function new_operator(_constructor, ...args) {
  // ① 创建新对象obj,并关联obj原型到构造函数原型对象上
  let obj = Object.create(_constructor.prototype)
  // ② 执行构造函数,且绑定this到新对象Obj上,实现继承。同时接受返回值res
  let res = _constructor.apply(obj, args)
  // ③ 返回值判断
  return res instanceof Object ? res : obj
}

6.手写Promise.race

Promise.myRace = arr => {
  return new Promise((resolve, reject) => {
    arr.forEach(p => p.then(resolve, reject))
  })
}
//Promise.any(谁先成功)比Promise.race(谁先完成)好用

7.手写Promise.all

Promise.myall = promises => {
  let complete = 0
  let result = []
  return new Promise((resolve, reject) => {
    for (let i = 0; i < promises.length; i++) {
      promises[i].then(res => {
        complete++
        result[i]= res
        if (complete == promises.length) {
          resolve(result)
        }
      }, reject)
    }
  })
}

8.(京东快手)两数之和

示例:nums = [2,7,11,15] target = 9 //输出[0,1]
思路:nums 去相亲者,target 匹配的条件,字典建立一个介绍所储存相亲者的数字和下标

//obj解法
let nums = [2, 7, 11, 15],
  target = 9;
function Two(nums, target) {
  const obj = {}
  for (let i = 0; i < nums.length; i++) {
    let a = nums[i]
    let b = target - a
    if (obj[b] != undefined) {
      return [obj[b], i]
    } else {
      obj[a] = i
    }
  }
  return null
}
//时间复杂度和空间复杂度都是O(n)
//Map解法
var twoSum = function (nums, target) {
  let map = new Map()
  for (let i = 0; i < nums.length; i++) {
    const n = nums[i]
    const n2 = target - n // 符合匹配条件的选手
    if (map.has(n2)) {
      return [map.get(n2), i] // 返回符合条件对象的下标,自身下标
    } else {
      map.set(n, i)
    }
  }
}
//时间复杂度 O(n)//空间复杂度 O(n)//线性

9. 两个数组的交集 题号 349

Map 解题思路,新建立一个字典,遍历 nums1,填充字典,遍历 nums2,遇到字典值就选出,并从字典里删除

var intersection = function (nums1, nums2) {
  const map = new Map()
  nums1.forEach(n => {
    map.set(n, true) //代表这个值在字典里存在
  })
  let res = []
  nums2.forEach(n => {
    if (map.get(n)) {
      res.push(n)
      map.delete(n)
    }
  })
  return res
}
//时间复杂度O(n+m)
//空间复杂度指临时变量内存消耗 O(m)

10.拍平数组,去除重复部分,得到升序不重复数组,[[1,2,2],[3,4,5,5],[6,7,8,9[11,12,[12,13,[14]]]],10]

flat1(arr5)
function flat1(a) {
  let res = []
  let json = {}
  //拍平并去重
  for (let i = 0; i < a.length; i++) {
    if (typeof a[i] == 'number') {
      // if(!res.includes(a[i])){//低性能版
      //   res.push(a[i])
      // }
      if (!json[a[i]]) {
        //高性能
        res.push(a[i])
        json[a[i]] = true
      }
    } else {
      flat1(a[i])
    }
  }
}

11.爬楼梯 70 dp问题

定义子问题f(n) = f(n-1) + f(n-2)
反复执行 从2循环到n,执行上述公式

var clibStairs2 = function (n) {
  if (n < 2) {
    return 1
  }
  let dp0 = 1
  let dp1 = 1
  for (let i = 2; i < n; i++) {
    const tmp = dp0
    dp0 = dp1
    dp1 = dp1 + tmp 
  }
  return dp1
}
//时间复杂度 o(n)
//空间复杂度 o(n)                   

12.变态版青蛙跳台阶 dp问题

function jump(n){
  if(n<0){
    return -1
  }else if(n==1){
    return 1
  }else{
    return 2*jump(n-1)
  }
}

13. 环形链表,题号 141

解题思路:有一快一慢两个指针遍历链表,指针可以相逢,说明有环,返回 true,两个指针不相逢就说明没有环,返回 false

var hasCycle = function (head) {
  let p1 = head //慢指针
  let p2 = head //快指针
  while (p1 && p2 && p2.next) {
    p1 = p1.next //走一步
    p2 = p2.next.next //走两步
    if (p1 === p2) {
      //两个指针是否重逢
      return true
    }
  }
  return false
}
//有while循环,时间复杂度 O(n)
//空间复杂度:O(1)。因无线性增长结构,矩阵,列表

14.旋转数组 189

function shift(arr, k) {
  k %= arr.length
  if (k >= Math.floor(arr.length / 2)) {
    arr.push(...arr.splice(0, arr.length - k))
  } else {
    arr.unshift(...arr.splice(arr.length - k, k))
  }
  return arr
}

15.实现 sleep 函数,等待 1000ms,可以从 promise、generator、async 角度实现,本意问实现 promise

function sleep(ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms)
  })
}
;(async () => {
  console.log(11)
  await sleep(2000)
  console.log(22)
})()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容