2023手写代码面试题

211 阅读2分钟

冒泡排序 bubblingSort

let arr = [99,33,66,17,24,87,65,22,666,103];
function bubblingSort(ary){
    for (let i = 0; i < ary.length-1; i++) {
        console.log('1');
        let flag = true;
        for (let j = 0; j < ary.length-1-i; j++) {
            console.log('2');
            if(ary[j]>ary[j+1]){
                let temp = ary[j];
                ary[j] = ary[j+1];
                ary[j+1] = temp;
                flag = false;
            }                  
        }
        if(flag){
            break
        }
    }
    return ary
}
let result = bubblingSort(arr);
console.log(result);

快速排序 quickSort

let arr = [99,33,66,17,24,87,65,22,666,103];
function quickSort(ary){
    if(ary.length<=0) return ary
    let middleIndex = Math.floor(ary.length/2);
    console.log(middleIndex);
    let leftArr = [],
        rightArr = [];
    for (let i = 0; i < ary.length; i++) {
        if(ary[i]>ary[middleIndex]){
            rightArr.push(ary[i])
        }
        if(ary[i]<ary[middleIndex]){
            leftArr.push(ary[i])
        }
    }
    return quickSort(leftArr).concat(ary[middleIndex],quickSort(rightArr))
}
let result = quickSort(arr);
console.log(result);

插入排序 insertionSort

let arr = [99,33,66,17,24,87,65,22,666,103];
function insertionSort(ary){
    let newAry = [];
    newAry.push(ary[0]);
    for (let i = 1; i < ary.length; i++) {
        let cur = ary[i];
        // 循环 arr 中的每一项,跟新数组newArr中从后往前依次进行比较,如果比新数组中的这一项小,那么需要继续和上一项进行比较,如果比新数组中这一项大,那么放在该项的后面
        for (let j = newAry.length-1;j>=0;j--) {
            if(cur<newAry[j]){
                if(j===0){
                    newAry.unshift(cur)
                }
            }else{
                newAry.splice(j+1,0,cur)
                break;
            }
        }
    }
    return newAry
}
let result = insertionSort(arr);
console.log(result);

防抖 debounce

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <input type="text" id="input1">
    </div>
    <script>
        const input1 = document.getElementById('input1')
        function debounce(fn,delay=500){
            let timer = null;
            return function (){
                if(timer){
                    clearTimeout(timer)
                }
                timer = setTimeout(()=>{
                    fn.apply(this,arguments)
                    timer = null
                },delay)
            }
        }
        
        // 功能测试
        input1.addEventListener('keyup',debounce(function(){
            console.log(input1.value);
        },2000))

    </script>
</body>
</html>

节流 throttle

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>
        <div id="div1" draggable="true">可拖拽</div>
    </div>
    <script>
        const div1 = document.getElementById('div1');
        function throttle(fn, delay = 500) {
            let timer = null;
            return function () {
                if (timer) return;
                timer = setTimeout(() => {
                    fn.apply(this, arguments)
                    timer = null
                }, delay)
            }
        }
        div1.addEventListener('drag', throttle(function (e) {
            console.log(e.offsetX,e.offsetY);
        }, 200))
    </script>
</body>

</html>

深拷贝 deepClone

let obj =  {name:'小明',age:18};
function deepClone(obj){
    if(Object.prototype.toString.call(obj)==='[object Object]'){
        let newObj = {};
        for(let key in obj){
            newObj[key] = deepClone(obj[key])
        }
        return newObj
    }else if(Object.prototype.toString.call(obj)==='[object Array]'){
        let newArr = [];
        obj.forEach(item=>{
            newArr.push(deepClone[item])
        })
    }
    return obj
}
let obj1 = deepClone(obj);
obj.name='小红';
obj.age=20;
console.log(obj); // {name: '小红', age: 20}
console.log(obj1); // {name: '小明', age: 18}
console.log(obj===obj1); // false

将数组转换为树结构

let list = [
    { idSelf: 1, label: "苹果", idParent: 100, },
    { idSelf: 2, label: "茄子", idParent: 200, },
    { idSelf: 3, label: "香蕉", idParent: 100, },
    { idSelf: 4, label: "运动类型", idParent: 300, },
    { idSelf: 100, label: "水果", idParent: 900, },
    { idSelf: 200, label: "蔬菜", idParent: 600, },
];

function listToTree(arr, id) {
    return arr
        .filter((item) => {
            return item.idParent == id; //过滤找到父节点
        })
        .map((item1) => {
            return { ...item1, children: listToTree(arr, item1.idSelf) }; //根据父节点的id找下层子节点
        });
};

let newList = listToTree(list, 900);
console.log(newList);

实现数组扁平化

let ary = [1, 2, [3, 4, 5, [6, 7, 8, [9, 10]]]];
//数组扁平化
let arr = ary.toString().split(',').map(item => {
    return + item;
});
console.log(arr);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

找出数组中的最大值和第二大的值

let ary = [43,1,34,98,555,356];
function aryMethod(arr=[]) {
    // 如果长度小于2 那么直接返回数组
    if(arr.length<2)return [arr[0],null];
    for (let i = 0; i < arr.length - 1; i++) {
      // 比较轮数
      for (let j = 0; j < arr.length - 1 - i; j++) {
        // 每轮比较次数,由于每次最后一个都是最大值,每轮少比较i次
        if (arr[j] > arr[j + 1]) {
          [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        }
      }
    }
    return [arr[arr.length-1],arr[arr.length-2]];
};

let [max,second] = aryMethod(ary)||[];
console.log(max,second);// 555   356

对象去重

let ary = [
    { id: 0, name: "小明" },
    { id: 1, name: "小张" },
    { id: 2, name: "小李" },
    { id: 3, name: "小孙" },
    { id: 1, name: "小周" },
    { id: 2, name: "小陈" },
];
function deWeightObj(arr){
    let newObj = {};
    let newArr = [];
    arr.forEach((item)=>{
        if(!newObj[item.id]){
            newArr.push(item)
            console.log(newObj[item.id]);
            newObj[item.id] = true;
        }
    })
    return newArr
}
let result = deWeightObj(ary);
console.log(result);

数组去重

let arr = [11, 22, 33, 11, 55, 44, 55, 66, 22, 33];
function deWeight(ary) {
    let obj = {};
    let newArr = [];
    for (let i = 0; i < ary.length; i++) {
        let cur = ary[i];
        if (obj[cur] === cur) {
            ary[i] = ary[ary.length - 1];
            ary.length--;
            i--;
            continue;
        }
        obj[cur] = cur;
    }
    for(let i in obj){
        newArr.push(obj[i])
    }
    return newArr
    
}
let result = deWeight(arr);
console.log(arr);

数组扁平化

let arr = [[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[14]]],10];
function flatten(ary){
    return ary.toString().split(',').map(item=>{
        return + item
    })
}
let result = flatten(arr);
console.log(result);