【金三銀四】關於Web前端開發中常見的經典算法題 阿里、字節跳動真題

引言


金三銀四,特地整理一份面試題,現介紹本文特色:
1、適合前端,需要面試找工作
2、即將畢業面臨實習,積累經驗
3、從務實基礎到徹底弄懂
4、探索框架源碼,研究前端必備算法
5、直擊阿里、騰訊、美團、今日頭條等大廠原題,逐步引入
6、學完即準備投簡歷

BAT/TMD這樣的大公司是如何面試的


注意嗷,在這裏TMD可不是罵人的話哦,可能你知道BAT,但TMD你知道麼?(不知道趕緊去百度!)

T(今日頭條)M(美團)D(滴滴)成爲了BAT之後互聯網江山的新巨頭

相關文章

【金三銀四】一個問題就知道你會不會CSS了

【金三銀四】一個問題就知道你會不會JS了 阿里、頭條真題解析

【金三銀四】一個問題就知道你看沒看過源碼了 深度挖掘必問源碼題

算法題引入

其實算法對於前端來說並沒有後端那麼看重,但是面試也是常問的,關鍵在於考察你的思維邏輯能力

1.數組去重和排序的多種實現

數組去重

第一種方法:ES6 - 直接用Set

let arr=[12,23,15,12,48,55,16,12,6,8,6,10];
/*直接用SET */
let a = [...new Set(arr)];
let b = Array.from(new Set(arr));
console.log(a,b);


第二種方法:拿出當前項和後續進行比較(會新增堆內存)

/*拿出當前項和後續進行比較*/
let arr=[12,23,15,12,48,55,16,12,6,8,6,10];
let c=[];
for(let i=0;i<arr.length;i++){
    let item=arr[i],
        args=arr.slice(i+1);
    if(args.indexOf(item)==-1){
        //無重複項
        c.push(item);
    }
}
console.log(c);

第三種方法:對象鍵值對

數組排序

冒泡排序

插入排序

快速排序

2.數組扁平化的N種實現方案

即將多維數組變爲一位數組

第一種方法:使用ES6中flat方法

/**數組扁平化 */
let arr= [
    [1,2,2],
    [3,4,5,5],
    [6,7,8,9,[11,12,[12,13,[14]]]],10
];
/**ES6方法: */
arr=arr.flat(Infinity);
console.log(arr);

第二種方法:使用toString()然後將字符串轉化數字

/**使用toString()然後將字符串轉化數字 */
arr=arr.toString().split(',').map(item=>parseFloat(item));
console.log(arr);

第三種方法:轉化JSON格式字符串 然後用正則替換所有的[](比上一種方法多了一步,加了正則)

/**轉化JSON格式字符串 然後用正則替換所有的[] */
arr=JSON.stringify(arr).replace(/(\[|\])/g,'').split(',').map(item=>parseFloat(item));
console.log(arr);

第四種方法:循環驗證是否爲數組

/**循環驗證是否爲數組 */
while(arr.some(item=>Array.isArray(item))){
    arr=[].concat(...arr);
}
console.log(arr);
3.阿里面試題之斐波那契數列
function fibonacci(count){
    function fn(count,curr=1,next=1){
        if(count==0){
            return curr;
        }else{
            return fn(count-1,next,curr+next);
        }
    };
    return fn(count);
}
4.字節跳動經典算法題
/**
 * 輸入一個正數N,輸出所有和爲N的連續正數序列
 * 例如:輸入15
 * 結果:[[1,2,3,4,5],[4,5,6],[7,8]]
 */

function createArr(n,len){
    let arr=new Array(len).fill(null),
        temp=[];
    arr[0]=n;
    arr=arr.map((item,index)=>{
        if(item==null){
            item=temp[index-1]+1;
        }
        temp.push(item);
        return item;
    });
    return arr;
}
function fn(count){
    let result=[];
    //=>求出中間值
    let middle=Math.ceil(count/2);
    //從1開始累加
    for(let i=1;i<=middle;i++){
        //控制累加多少次
        for(let j=2;;j++){
            //求出累加多次的和
            let total=(i+(i+j-1))*(j/2);
            if(total>count){
                break;
            }else if(total==count){
                result.push(createArr(i,j));
                break;
            }
        }
    }
    return result;
}
console.log(fn(15));

學如逆水行舟,不進則退
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章