【面试题】常见面试题汇总————手写题

方法类

数组去重排序

经典问题方法要尽可能多

let arr = [9,9,8,8,1,2,5,2,3,4,5,5,5];

//1、使用set方法

let num = [...new Set(arr)].sort((a,b) => a - b);
//console.log(num);

//2、使用indexof

function unique(arr){
    let res = [];
    for(let i = 0; i < arr.length; i++){
        if(res.indexOf(arr[i]) == -1){
            res.push(arr[i]);
        }
    }

    return res;
}

//排序
console.log(unique(arr));

//写一个快速排序

function quicksort(arr){
    if(arr.length <= 1) return arr;

    let left = [];
    let right = [];
    let index = Math.floor(arr.length/2);
    let pivot = arr.splice(index,1)[0];
    //arr = arr.splice(index,1)[0];

   
    for(let i=0; i < arr.length; i++ ){
        if(arr[i] < pivot ){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }

    return quicksort(left).concat([pivot],quicksort(right));
    
}

let step1= unique(arr);
console.log(quicksort(step1));

这里面包含了去重方法和排序方法

数组去重

Array.from(new Set(arr));

[...new Set(arr)];

function unique(arr){
    const h = Object.create(null)
    arr.forEach(v => h[v] = 1)
    return Object.keys(h).map(v => v | 0);
}

function unique (arr) 
{ const h = new Map() 
    arr.forEach(v => h.set(v, 1)) 
    return Array.from(h.keys()) 
}

function unique(arr) {
    for(let i = 0; i < arr.length; i++){
        for(let j = i + 1; j <arr.length; j++){
            if(arr[i] === arr[j]){
                arr.splice(j,1);
                j--;
            }
        }
    }
    return arr;
}

function unique(arr){
    return arr.filter((v,index,ar) => ar.indexOf(v) === index);
}


function unique(arr){
    const r = [];
    arr.forEach(v => !r.includes(v) && r.push(v))
    return r
}

function bubbleSort(arr){
    for(let i = 0; i < arr.length; i++){
        for(let j = i+1; j < arr.length; j++){
            if(arr[j] < arr[i]){
                [arr[j],arr[i]] = [arr[i],arr[j]];
            }
        }
    }
    return arr;
}

const sort = (a) => {
    for(let i = 0; i < a.length; i++){
        for(let j = i; j-- && a[j+1] < a[j]){
            [a[j+1],a[j]] = [a[j],a[j+1]];
        }
    }
    return a;
}

数组排序

sort(),快排,冒泡

数组拍平,降维

//数组拍平,多维数组降维

let arr = [1,[2,[3,3,4]],[2,3]];

function flaten(arr){
    let arr1 = [];
    for(let i = 0; i < arr.length;i++){
        if(arr[i] instanceof Array){
            arr1 = arr1.concat(flaten(arr[i]));
        }else{
            arr1.push(arr[i])
        }
    }

    return arr1;
}


function flaten(arr){
    return arr.reduce((prev,cur) => {
        return prev.concat(Array.isArray(cur) ? flaten(cur):cur)
    })
}

let arr1 = arr.toString().split(',').map((val) => {
    return parseInt(val);
})

判断一个数组是不是数组

Array.prototype.isPrototypeof(o);

o instanceof Array

Array.isArray(o);

Object.prototype.toString.call(o) === '[object Array]'

二级目录

lc编程类

全排列

const permute = function(nums){
    const res = [],path =[] ;
    let used = new Array(nums.length).fill(false);
    backtracking(nums,nums.length,[]);
    return res;

    function backtracking(n,k,used){
        if(path.length === k){
            res.push(Array.from(path));
            return;
        }

        for(let i = 0; i <k; i++){
            if(used[i]) continue;
            path.push(n[i]);
            used[i] = true;
            backtracking(n,k,used);
            path.pop();
            used[i] = false;
        }
    }
}

js实现类

手写promise

手写then

手写instanceof

function my_instanceof(left,right){
    let l_proto = left.__proto__;
    let a = right.prototype;

    while(true){
        if(l_proto === null){
            return false;
        }

        if(l_proto === a){
            return true;
        }

        l_proto = l_proto.__proto__;
        
    }


}

节流防抖

//节流
var timer;

function debounce(fn,delay){
    clearTimeout(timer);
    timer = setTimeout(function(){
        fn();
    },delay)
}

深浅拷贝

//object.assign()
//第一个参数是目标对象,其余参数是源对象

let target = {a:1}
let object1 = {b:2};
let object2 = {c:2,b:3,a:2};


//第一个参数是目标对象,剩下的是源,把没有的拷贝上,后面的同名属性会覆盖前面的
Object.assign(target,object1,object2);
//console.log(target);

//扩展运算符,在构造字面量对象的时候,进行属性拷贝,语法 
//浅拷贝,一个对象的深拷贝,嵌套的浅拷贝????
let obj1 = {a:1,b:{c:1}};
let obj2 = {...obj1};
obj1.a = 2;

// console.log(obj2);
// console.log(obj1);

// obj1.b.c = 33;
// console.log(obj1);
// console.log(obj2);

//数组方法实现数组浅拷贝
//Array.prototype.slice()
//Array.prototype.concat(),两个参数都不写,就会返回一个数组的浅拷贝

//手写实现浅拷贝
function shallowCopy(object){
    //只拷贝对象
    if(!object || typeof object !== "object") return;
    //根据类型决定新建一个数组还是对象
    let newObject = Array.isArray(object)?[]:{};
    //遍历object,并且判断是object的属性才拷贝
    for(let key in object){
        if(object.hasOwnProperty(key)){//原型上的属性就不拷贝了
            newObject[key] = object[key];
        }
    }

    return newObject;
}

//深拷贝
//遇到属性值为引用类型的时候,新建一个引用类型并将对应的值复制给他
/*
获得一个新的引用类型而不是原有类型的引用,
*/

//JSON.stringify()
/*
的原理就是利用JSON.stringify 将js对象序列化(JSON字符串)
再使用JSON.parse来反序列化(还原)js对象。

拷贝的对象中如果有函数,undefined,symbol,
当使用过JSON.stringify()进行处理之后,都会消失。

*/

var objk = {
    a:0,
    b:{
        c: 0
    }
};

let obj3 = JSON.parse(JSON.stringify(objk));
objk.a = 1;
objk.b.c = 1;

/*
库函数lodash也提供了深拷贝方法,_.cloneDeep
*/
var _ = require('lodash');
var obj8 = {
    a:1,
    b:{f: { g: 1}},
    c: [1,2,3]
};

var obj4 = _.cloneDeep(obj8);
obj1.b.f.g = 1234
//console.log(obj4);

function deepCopy(object){
	if(!object||typeof object !== "object") return;
	let newObject=Array.isArray(object)?[]:{};
	for(let key in object){
		if(object.hasOwnProperty(key)){
			newObject[key]=typeof object[key]==="object"?deepCopy(object[key]):object[key];
		}
	}
	return newObject;
}



promise实现3秒后输出123

//3s输出111

function my_print(num){
    let res = new Promise(function(res,err) {
            setTimeout(function(){
                res(num);
            },1000)
    })

    return res;
}

my_print(123).then(res => {
    console.log(res);
})

promise.all

Promise.myAll = function(promiseArr){
    return new Promise((resolv,reject) => {
        const ans = [];
        let index = 0;
        for(let i = 0; i < promiseArr.length; i++){
            promiseArr[i].then(res => {
                ans[i] = res;
                index++;
                if(index === promiseArr.length){
                    this.resolve(ans);
                }
            })
            .catch(err => reject(err));
        }
    })
}

promise.race

Promise.race = function(arr){
    return new Promise(function(resolve,reject){
        if(!Array.isArray(arr)){
            return reject(new TypeError('promise.race accepts an array'))
        }

        for(var i = 0, len = arr.length; i < len; i++){
            Promise.resolve(arr[i]).then(resolve,reject);
        }
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值