滴滴實習面試題

2022-09-17 18:57:12 字數 2228 閱讀 8736

本文寫於 2020 年 8 月 13 日

前兩天在滴滴進行了前端實習面試,有幾道題卡了一下。

乙個陣列裡可能是基本資料型別,也可能是陣列,陣列裡還能巢狀陣列,例如:[1, 2, [4, [5, 7]], [[9]]]

請將陣列扁平化,全部變成一維陣列:[1, 2, 4, 5, 7, 9]

我第一次聽題目的時候沒聽清,所以直接寫了一次遍歷,判斷是否是陣列,沒有考慮陣列巢狀的情況。

之後,便採用了遞迴的方法:

function flatarr(arr)  else 

}} return newarr;

}

但是實際上,有更好的方法。

方法一:遞迴

不管怎麼樣,這種方法的核心思路就是遞迴。用for也好,用while也好,都是遞迴呼叫。

比如我們可以利用reduce來減少**行數,這也是我最喜歡的一種方法。

function flatarr(arr) , );

}}

**的基礎思路跟上面其實是一模一樣的,但是卻將**縮減了至少一半!

或者說可以用while來進行:

function flatten(arr) 

return arr;

}

但不推薦這麼寫,因為會對傳入的引數進行修改。

方法二:偷巧

arr.tostring()返回的是乙個字串,這個字串是以陣列內的元素加上逗號生成的。

神奇的地方在於,當我們有乙個陣列為[1, [2]]的時候,他並不會變成"1,[2]",而是會變成"1,2"

所以我們就可以通過它來扁平化陣列:

function flatarr(arr) 

}

這種方法不用tostringjoin(',')的效果是一樣的。

首先來看promise.all()的用法:

const p1 = new promise((resolve, reject) =>  else 

});const p2 = new promise((resolve, reject) => else

});const p3 = new promise((resolve, reject) => else

});promise.all([p1, p2, p3]).then((results) => , (error) => );

只有當三個 promise 物件都成功時,才會執行 then 方法的第乙個函式;只要有乙個失敗了,就會執行第二個函式。

對於promise.all()來說,首先接收的是乙個可迭代物件。

接收乙個promise例項的陣列或具有iterator介面的物件;

如果元素不是promise物件,則使用promise.resolve轉成promise物件,也就意味著如果不是promise物件,就讓他變成完成狀態的promise

如果全部成功,狀態變為resolved,返回值將組成乙個陣列傳給**;

只要有乙個失敗,狀態就變為rejected,返回值將直接傳遞給**all()的返回值也是新的promise物件。

那我們就好實現了:

function promiseall(promises) 

let resolvedcounter = 0;

let promisenum = promises.length;

let resolvedvalues = new array(promisenum);

for (let i = 0; i < promisenum; i++)

}, (reason) => )}})

}

(完)

滴滴面試題

1 快速排序和二分排序選乙個手寫。手寫了乙個快排。2 手寫乙個 eventemitter。3 手寫兩個陣列的交集。兩層 for 迴圈。將兩陣列排序後,使用雙指標去判斷。4 webpack 執行流程,seal 方法之後都有什麼?什麼時候生成 chunk 5 ts 中 thistype 是什麼?this...

位元組實習面試題

題目 給定m個不重複的字元 a,b,c,d 以及乙個長度為n的字串tbcacbdata,問能否在這個字串中找到乙個長度為m的連續子串,使得這個子串剛好由上面m個字元組成,順序無所謂,返回任意滿足條件的乙個子串的起始位置,未找到返回 1。比如上面這個例子,返回3.public class findin...

滴滴出行大資料實習生面試題

二叉樹的遍歷,前序的遞迴演算法 輸出 void visit binarytree t 前序遍歷 void preorder bitree t 二叉樹的遍歷的非遞迴演算法 1 前序遍歷 思路 訪問t data後,將t入棧,遍歷左子樹 遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。先序...