前端手写题

一些前端手写题的示例


二分查找

function dichotomySearch(arr,target){
    let low =0
    let high =arr.length-1
    while(low<=high){
    let mid = Math.floor((low + high) /2) 
      if(target==arr[mid]){
            return mid
        }else if(target>arr[mid]) {  
            low = mid +1
        }else{
            high =mid -1
        }
    }
    return -1
}
let arr =[1,3,5,6,7,8,9,9]
console.log(dichotomySearch(arr,5))

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。

  • 示例 1:

输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

  • 示例 2:

输入:nums = [3,2,4], target = 6 输出:[1,2]

  • 示例 3:

输入:nums = [3,3], target = 6 输出:[0,1]

let nums = [2,7,11,15];
let target = 9;
const twoSum =(nums,target)=>{
    let map =new Map()
    for(let i=0;i<nums.length;i++){
        const currentNum =nums[i]
        const targetNum =target - currentNum //重点
        const targetIndex =map.get(targetNum) //重点
        if(targetIndex!==undefined){
            return [targetIndex,i]
        }else{
            map.set(currentNum,i)
        }
    }
}
console.log(twoSum(nums,target))

实现EventBus

class EventBus {
    constructor(){
        this.events={}
    }
    on(event,callback){
        if(!this.events[event]){
            this.events[event]=[]
        }
        this.events[event].push(callback)
    }
    emit(event,...arg){
        if(this.events[event]){
            this.events[event].forEach(element => {
                element(...arg)
            });
        }
    }
    off(event,callback){
        if(this.events[event]){
            this.events[event].filter(fn=>fn!=callback)
        }
    }
    once(event,callback){
        if(this.events[event]){
          const  onCallback=function(...arg){
            callback(arg)
            this.off(event,onCallback)
          }
          this.$on(event,onCallback)
        }

    }

}
const bus =new EventBus()
bus.on('aa',(params)=>{
    console.log(params)
})
bus.emit('aa',2323)

快速排序

let arr =[7,34,2,57,21,5,73,6,5,7,9,2,11,31,16]
const quickSort =(arr)=>{
    if(arr.length<=1) return arr
    const point =arr[Math.floor(arr.length/2)]
    let left = arr.filter(num=>num<point)
    let middle =arr.filter(num=>num==point)
    let right =arr.filter(num=>num>point)
    return [...quickSort(left),...middle,...quickSort(right)]
}
quickSort(arr)

手写call

Function.prototype.myCall = function (context, ...arg) {
    if (typeof this != 'function') {
        throw Error('函数才可调用')
    }
    let key = Symbol()
    context[key] = this
   const result = context[key](arg)
    delete context[key]
    return result

}
function greet(greeting) {
    console.log(`${greeting}, ${this.name}`);
}

const person = { name: "Alice" };
greet.myCall(person,'hello')