本文寫於 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)
}
這種方法不用tostring
用join(',')
的效果是一樣的。
首先來看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的右子樹。先序...