前端面試算法總結(jié)

1.合并有序數(shù)組
方法一:清空符合條件的原數(shù)組

function merge(l1,l2){
    let res = [];
    while(l1.length && l2.length){
        if(l1[0]<l2[0]){
            res.push(l1.shift())
        }else{
            res.push(l2.shift())
        }
    }
    res = res.concat(l1,l2);
    return res
}

方法二:雙指針

function merge(l1,l2){
    let res = [];
    let i=0;j=0
    while(i<l1.length && j<l2.length){
        if(l1[i]<l2[j]){
            res.push(l1[i])
            i++;
        }else{
            res.push(l2[j])
            j++
        }
    }
    while(i<l1.length){
        res.push(l1[i])
        i++;
    }
    while(j<l2.length){
        res.push(l2[j])
        j++;
    }
    return res
}
let l1 = [1,4,5,23];
let l2 = [0,2,3,6,7,8];
console.log(merge(l1,l2))

2.用指定數(shù)組內(nèi)容按照數(shù)字順序替換占位符@1@留美,@2@
例子:str = 你好@1@,天氣@2@ arr = ['李明','晴'] =》你好李明塔次,天氣晴

function cusReplce(str,repArr){
    for(let i=0; i<repArr.length; i++){
         str = str.replace(new RegExp('@'+(i+1)+'@'),repArr[i])
    }
   return str;
}
let str = '你好@1@益缎,天氣@2@';
let arr = ['李明','晴朗'];
console.log(cusReplce(str,arr))

3.多維數(shù)組扁平化

function flatter(list){
   if(Array.isArray(list)){
       return list.reduce((a,b)=>{
           return [...a, ...flatter(b)]
       },[])
   }
   return [list];
}
let arr = [1,2,[3,[4,5]]];
console.log(flatter(arr))

4.M*N的棋盤從左上角到右下角總共有多少種走法,要求不能回頭

function chess(m,n){
   if(m<1||n<1) return 0;
   if(m==1 && n!==1){
       return n+1;
   }
   if(m!=1 && n==1){
       return m+1;
   }
   return chess(m-1,n)+chess(m,n-1)
}

5.二叉樹是否存在路徑總和等于目標(biāo)值

function path(root,target){
   if(!root){
       return false
   }
   if(!root.left&&!root.right){
     return root.value == target;
   }
   return path(root.left,target-root.value) || path(root.right,target-root.value);
}

6.var locationList = [
{ id: 0, name: "中國(guó)" },
{ id: 1, pid: 0, name: "廣東省" },
{ id: 2, pid: 1, name: "深圳市" },
{ id: 3, pid: 1, name: "廣州市" },
{ id: 4, pid: 0, name: "陜西省" },
]
變?yōu)?br> [{
id: 0,
name: "中國(guó)" ,
children:[
{ id: 1,
pid: 0,
name: "廣東省",
children:
[
{ id: 2, pid: 1, name: "深圳市" ,children:[]},
{ id: 3, pid: 1, name: "廣州市",children:[] }
]
},
{ id: 4, pid: 0, name: "陜西省" ,children:[]},
]
}].

function buildLocationTree(list){
   let map = {};
   for(let i=0; i<list.length;i++){
       let id = list[i]['id'];
       map[id] = list[i]
   }
   let res = [];
   for(let i=0; i<list.length;i++){
       let item = list[i];
       let pid = item['pid'];
       if(pid !== undefined && map[pid]){
           if(map[pid].children){
               map[pid].children.push(item)
           }else{
               map[pid].children = [item]
           }   
       }else{
           res.push(item)
       }
   }
   return res;
}

7.樹的遍歷

let tree =  [{"id":0,"name":"中國(guó)","children":[{"id":1,"pid":0,"name":"廣東省","children":[{"id":2,"pid":1,"name":"深圳市"},{"id":3,"pid":1,"name":"廣州市"}]},{"id":4,"pid":0,"name":"陜西省"}]}]
找出指定id的name
function dfs(list,id){
    for(let i=0;i<list.length;i++){
        let item = list[i];
        if(item.id == id){
            return item.name;
        }
        else if(item.children && item.children.length>0){
            dfs(item.children,id)
        }
        else{
            return -1
        }
    }
}

function find(lists,id){
    if(lists.id == id){
        return lists.name;
    }
    else{
        if(lists.children && lists.children.length>0){
            return dfs(lists.children,id)
        }
    }
}
console.log(find(tree,6))

8.add(1,2)(2)() // 5

function add(){
    let args = [...arguments];
    let res = 0;
    for(let i = 0; i<args.length;i++){
        res += args[i];
    }
    return function F(...args1){
        if(args1.length){
            return add(...args,...args1)
        }
        else{
            return res;
        }
    }
}
console.log(add(1,2)(4)())

9.實(shí)現(xiàn)一個(gè)console和setTimeout鏈?zhǔn)秸{(diào)用

class A{
    constructor(){
        this.promise = Promise.resolve()
    }

    console(v){
        this.promise = this.promise.then(()=>{
            console.log(v)
        })
        return this;
    }

    setTimeout(wait){
        this.promise = this.promise.then(()=>{
            return new Promise((resolve)=>{
                setTimeout(()=>{
                    resolve()
                },wait)
            })
        })
        return this;
    }
}
let a = new A()
a.console('1').setTimeout(1000).console('2')

10.實(shí)現(xiàn)一個(gè)sleep

function sleep(wait){
    return new Promise((resolve,reject)=>{
        setTimeout(resolve,wait)
    })
}
async function init(wait){
    let res = await sleep(wait)
    console.log(3)
    return res;
}
console.log(1)
init(3000)

11.實(shí)現(xiàn)compose函數(shù)

function compose(...args){
    let len = args.length;
    let count = len-1;
    let res = '';
    return function F(...args1){
        res = args[count].apply(this,args1);
        if(count <= 0){
            return res
        }else{
            count--;
            return F(res)
        }
    }
}
let test = (x,y) => x+y
let uppcase = (x) => x.toUpperCase()
let add = (x) => x+'123'
let re = compose(add, uppcase,test)('hello','world')
console.log(re)
  1. fn([['a', 'b'], ['n', 'm'], ['0', '1']]) => ['an0', 'am0', 'an1', 'am1', 'bn0', 'bm0', 'bn1', 'bm0']
function dfs(result, tempRes, curIndex, list){
    if(tempRes.length === list.length){
       result.push(tempRes.join(''));
       return;
    }
    for(let i=0;i<list[curIndex].length;i++){
        tempRes.push(list[curIndex][i]);
        dfs(result,tempRes,curIndex+1,list);
        tempRes.pop()
    }
}
function composeList(list){
    let len = list.length;
    let result = [];
    dfs(result,[],0,list);
    return result;
}
let term = composeList([['a', 'b'], ['n', 'm'], ['0', '1']]) 
console.log(term)

13.給數(shù)組中的字符串編號(hào)遇伞,f(['ab', 'c', 'd', 'ab', 'c']) => ['ab1', 'c1', 'd', 'ab2', 'c2']

function fn(list){
    let map = {};
    for(let i=0;i<list.length;i++){
        if(map[list[i]]){
            map[list[i]]++;
        }
        else{
            map[list[i]] = 1;
           
        }
        list[i] = list[i]+map[list[i]]
    }
    return list;
}
let list = fn(['ab', 'c', 'd', 'ab', 'c'])
console.log(list)
  1. 判斷鏈表有環(huán)
1.快慢雙指針 相遇則有環(huán)
function circle(head){
    let p1 = head;
    let p2 = head;
    while(p2 && p2.next){
        p1 = p1.next;
        p2 = p2.next.next
        if(p1 === p2){
            return true;
        }  
    }
    return false;
}
2.使用set判斷節(jié)點(diǎn)有沒有加入過,有的話則有環(huán)
function circle(head){
    let set = new Set();
    while(head){
        if(set.has(head)) return true
        set.add(head)
        head = head.next;
    }
    return false;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末据沈,一起剝皮案震驚了整個(gè)濱河市哟沫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锌介,老刑警劉巖嗜诀,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異孔祸,居然都是意外死亡隆敢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門崔慧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拂蝎,“玉大人,你說我怎么就攤上這事惶室∥伦裕” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵皇钞,是天一觀的道長(zhǎng)悼泌。 經(jīng)常有香客問我,道長(zhǎng)夹界,這世上最難降的妖魔是什么馆里? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上鸠踪,老公的妹妹穿的比我還像新娘以舒。我一直安慰自己,他們只是感情好慢哈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著永票,像睡著了一般卵贱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侣集,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天键俱,我揣著相機(jī)與錄音,去河邊找鬼世分。 笑死编振,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的臭埋。 我是一名探鬼主播踪央,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瓢阴!你這毒婦竟也來了畅蹂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤荣恐,失蹤者是張志新(化名)和其女友劉穎液斜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叠穆,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡少漆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硼被。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片示损。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嚷硫,靈堂內(nèi)的尸體忽然破棺而出屎媳,到底是詐尸還是另有隱情,我是刑警寧澤论巍,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布烛谊,位于F島的核電站,受9級(jí)特大地震影響嘉汰,放射性物質(zhì)發(fā)生泄漏丹禀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望双泪。 院中可真熱鬧持搜,春花似錦、人聲如沸焙矛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽村斟。三九已至贫导,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟆盹,已是汗流浹背孩灯。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逾滥,地道東北人峰档。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像寨昙,于是被迫代替她去往敵國(guó)和親讥巡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355