Facebook 面試題全解析

Facebook 面試題全解析

作者 | Joey Colon

頭圖 | CSDN 下載自視覺中國

出品 | CSDN(ID:CSDNnews)

儘管公眾對於Facebook褒貶不一,但他們對開源社區做出的貢獻卻實實在在造福了許多開發者。在這篇文章中,我來介紹一下你在面試Facebook的前端工程師職位時可能會遇到的面試題。

Facebook 面试题全解析

問題陳述

重新實現Array.flat:具體功能是,接受一個輸入數組,該數組可能包含任意層數的嵌套元素,返回一個新的數組,該數組將輸入數組展平。本題中,“展平”的數組指的是所有元素均為基本類型的數組。

示例

輸入:[1, [2, [3], 4], [5]]

輸出:[1, 2, 3, 4, 5]

Facebook 面试题全解析

理解問題

問題描述似乎很明確,就是要用輸入數組的值創建一個新的數組,但新數組不包含嵌套數組。

在這個階段,我會首先與面試官澄清我對於該問題的假設。我需要知道,輸入是否保證為數組(沒有非法輸入或空輸入)。面試官說,我們不能做這種假設。

另一個問題是:我們能否假設值一定為整數?儘管這個問題不太可能改變實現的細節,但在做出任何假設之前永遠要先澄清。我們假設嵌套在數組中的基本類型只有整數。

在澄清了一些細節問題後,我在白板上給出我自己的輸入示例,以及對應的輸出。

Facebook 面试题全解析

在畫出示例的時候,需要極其小心地注意你寫下的東西,以及你怎樣手工解決該問題。我喜歡先從簡單的例子開始,然後考慮邊界情況,逐步深入到複雜的問題。

Facebook 面试题全解析

匹配問題

如果只看第一個例子,那麼很顯然我們只需遍歷整個數組,檢查每個元素是否為整數值,然後將其值寫入輸出數組中。唯一不成立的條件就是當前檢查的元素是一個數組。如果當前元素是數組,就應該找到下一個非數組的元素,寫入到輸出數組中。這個問題似乎非常適合用遞歸解決。

但是要注意的是,任何需要遞歸的問題,都會面臨一個隱藏的限制:調用棧的深度限制。一定要向面試官清晰地表明這一點。面試官對我說不需要擔心該問題,很好,我們繼續。

Facebook 面试题全解析

計劃解決方案

思考解決方案很需要技巧。在用遞歸方式思考問題時,我們要問自己一個問題:給定當前輸入的調用棧的狀態,我們要完成什麼任務?

我認為,使用“驅動函數”的技巧處理遞歸非常容易。使用這個技巧,我們需要創建一個“殼”函數,設置好遞歸函數將要使用的初始值。例如下面的例子:

Facebook 面试题全解析

首先要把要完成的工作寫到輔助函數中,該函數執行完畢後,newArr就擁有了需要的值。

現在思考一下這個輔助函數。前面說過,我們要遍歷整個數組,如果當前元素不是數組,就直接放到新數組中;否則,就查看當前元素的其餘元素,直到找到新的數組。

Facebook 面试题全解析
Facebook 面试题全解析

實現

前面已經完成了大部分工作,所以只需要翻譯成代碼即可:

<code>const flatten = (arr) => {
if (arr === || arr.length === 0) return ;
const newArr = ;
flattenHelper(newArr, arr);
return newArr;
};

const flattenHelper = (newArr, currentArr) => {
for (let i = 0; i < currentArr.length; i++) {
if (Array.isArray(currentArr[i])) {
flattenHelper(newArr, currentArr[i]);
} else if (currentArr[i] !== ) {
newArr.push(currentArr[i]);
}
}
};


const arr = [1, [[2], 3, 4, ], [[5]]];
console.log(flatten(arr)); // 1,2,3,4,5
/<code>
Facebook 面试题全解析

檢查實現

編寫完代碼之後,需要花些時間驗證1-2個例子,運行整個程序。即使你的面試過程要求運行程序,你也要通過目視的方式檢查整個代碼。

Facebook 面试题全解析

評價實現

在評價步驟中,你要給出算法的複雜度、可以改進的地方等。關於運行時間,我們達到了O(N),這裡N是非數組元素的個數。空間複雜度也是O(N),因為我們創建了一個包含N個元素的數組。還有一點需要說明的是,空間是線性的。該算法無法再改進,因為我們需要訪問輸入數組中的每個元素至少一次。

此外,該問題中我們還可以使用reduce和concat。如果你習慣使用這些方法來編寫偽代碼,那就更好了,但我認為使用平直的代碼概念上會更容易。

Facebook 面试题全解析

心得

解決代碼問題沒有唯一的正確答案。這就是算法問題之美。解決問題的思路和方式會讓面試官對你另眼相看。

最後,需要注意的是,許多問題我們都要假設輸入可以任意大,大到可能會達到調用棧的上限,這就是為什麼要事先詢問面試官調用棧上限的問題。如果面試官表明我們需要考慮調用棧上限的問題,就要把遞歸函數改編成迭代的方式,自己維護調用棧。我在面試另一家大公司的時候就遇到了這個問題。除了要學會編寫迭代和遞歸代碼之外,還要學會怎樣將遞歸函數和迭代函數相互轉換。

原文:https://medium.com/better-programming/solving-facebooks-2020-front-end-engineering-interview-f34dd6b2a977

本文為 CSDN 翻譯,轉載請註明來源出處。

Facebook 面试题全解析

☞朱廣權李佳琦直播掉線,1.2 億人在線等

☞“抗疫”新戰術:世衛組織聯合IBM、甲骨文、微軟構建了一個開放數據的區塊鏈項目!

☞快速搭建對話機器人,就用這一招!

☞沒有監控和日誌咋整?老程序員來支招

☞“抗疫”新戰術:世衛組織聯合IBM、甲骨文、微軟構建了一個開放數據的區塊鏈項目!

☞萬字乾貨:一步步教你如何在容器上構建持續部署!

☞據說,這是當代極客們的【技術風向標】...

今日福利:評論區留言入選,可獲得價值299元的「2020 AI開發者萬人大會」在線直播門票一張。 快來動動手指,寫下你想說的話吧。


分享到:


相關文章: