Facebook 面試題全解析

2021-02-15 CSDN

以下為譯文:

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

問題陳述

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

示例

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

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

理解問題

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

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

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

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

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

匹配問題


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

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

計劃解決方案


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

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

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

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

實現


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

const flatten = (arr) => {
  if (arr === null || 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] !== null) {
      newArr.push(currentArr[i]);
    }
  }
};

const arr = [1, [[2], 3, 4, null], [[5]]];
console.log(flatten(arr)); // 1,2,3,4,5

檢查實現

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

評價實現

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

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

心得

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

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

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

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

更多精彩推薦

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

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

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

☞沒有監控和日誌咋整?老程式設計師來支招

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

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

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

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

相關焦點

  • Java 最常見的 200+ 面試題全解析
    第二:這只是經驗的高度提煉,讓那些原本就掌握了技術卻不知道怎麼表達的人,學會如何在面試中展示自己。第三:如果只是死記硬背這些面試題,只要面試官再深入問糾一下,也可對這個人有一個準確的認識,之前說的「幫人作弊」的事就不存在了。
  • Facebook面試記
    背景去年10月份的時候,我在找工作,在linkedin上收到了facebook recruiter的私信,標題是 Scaling Facebook's
  • 面試題:JS 獲取某月的天數
    回復交流,加入前端編程面試算法每日一題群面試官也在看的前端面試資料獲取某個月的天數
  • 尚矽谷Java視頻教程_Java面試題第一季
    網際網路寒冬來臨,打鐵還需自身硬,嘟嘟這裡分享一套最新Java面試題視頻,祝你更上一層樓。
  • 【面試題】Java必考面試題全集(30)
    Java基礎面試題(30)public
  • 2017大數據面試題及答案
    2017年有不少大數據學員學成準備參加工作,在參加工作前最重要的一輪就是大數據的面試,小編收集了一些2017大數據面試題及答案
  • 這道Facebook面試題掛掉了97%的人(二)
    前情提要上一篇文章裡,我們給大家介紹了Facebook的一道面試題
  • 面試題:如何求根號2
    > 來源:算法面試題
  • 【Android工程師面試必考】NDK與遊戲開發面試題 不看後悔!
    Android開發工程師面試時必然會遇到筆試的環節,極客學院為大家嘔心瀝血整理了Android開發工程師的經典筆試題目!
  • 前端同學經常忽視的一個 JavaScript 面試題
    ,特地從頭到尾來分析一次答案,這道題的經典之處在於它綜合考察了面試者的JavaScript的綜合能力,包含了變量定義提升、this指針指向、運算符優先級、原型、繼承、全局變量汙染、對象屬性及原型屬性優先級等知識,此題在網上也有部分相關的解釋,當然我覺得有部分解釋還欠妥,不夠清晰,特地重頭到尾來分析一次,當然我們會把最終答案放在後面,並把此題再改高一點點難度,改進版也放在最後,方便麵試官在出題的時候有個參考
  • 【007期】JavaSE面試題(七):異常
    大家好,我是Java面試題庫
  • 5 道刁鑽的 Activity 生命周期面試題
    今天我們一起來看五道 Activity 生命周期的面試題,相信看完之後面試官再問到相關的問題,你就能胸有成竹了。A Activity 打開 B Activity 時都有哪些生命周期回調。這道題相信很多同學都有遇到過,簡單:A.onPause -> B.onCrete -> B.onStart -> B.onResume -> A.onStop Naive !
  • 面試江湖:一招破解 Java 集合類面試題
    今日招式:Java集合類面試題Java集合類絕對是我們的老朋友了,Java技術江湖裡,誰人不知,誰人不曉,它的使用率非常高,使用難度卻也不大,這也導致了很多人對它不屑一顧,殊不知其中卻暗藏玄機,今天我們不妨一起來破解一下Java集合類的面試題。
  • Java基礎面試題:BS與CS的聯繫與區別
    本文收錄了一些Java面試題,學習沒有捷徑,希望大家都能少走一些彎路,在學習Java的道路上一往無前,學有所成。C/S是Client/Server的縮寫。伺服器通常採用高性能的PC、工作站或小型機,並採用大型資料庫系統,如Oracle、Sybase、InFORMix或 SQL Server。客戶端需要安裝專用的客戶端軟體。
  • 【css面試題】用css畫0.5px的線條
    > 本系列文章更新前端面試中關於
  • 應屆研究生分享:兩道帶坑又簡單的面試題!
    到今天為止有幸拿到五個面試, 其中有兩個On-Site.我自己還是個時常會緊張的人, 所以在面試前會試圖翻看過往學習的所有技術性內容. 當然啦, 常常都是徒勞, 因為我也摸不清楚面試官到底會問什麼. 我想了想, 為了記錄下我的面試歷程, 也是希望能幫助到大家, 我還是把每次被問到的技術問題都寫出來吧. 希望真的能幫到大家, 也希望諸位不要跟我一樣緊張.
  • 百度面試題:TO B 和TO C 產品有什麼不同
    「 百度面試題:TO B 和 TO C產品有什麼不同,是一道常見的面試題,那如何能給面試官眼前一亮,或者至少及格的分數呢
  • 程式設計師面試金典 - 面試題 01.08. 零矩陣
    題目難度: 中等原題連結[1]今天繼續更新程式設計師面試金典系列, 大家在公眾號 算法精選 裡回復 面試金典 就能看到該系列當前連載的所有文章了, 記得關注哦~題目描述編寫一種算法,若 M × N 矩陣中某個元素為 0,則將其所在的行與列清零
  • java面試——SpringMVC面試題集錦
    →[設為星標⭐]♪ 點擊上方綠標 收聽java面試——SpringMVC面試題集錦1、講下SpringMvc的核心入口類是什麼,Struts1,Struts2的分別是什麼SpringMvc
  • 一起手撕面試官多線程+Spring Boot+Spring Cloud+Mybatis面試題
    前言;之前跟大家分享了JVM與性能優化+Redis+Dubbo+分布式的面試題,今天繼續一起手撕面試官多線程