一道關於 ARRAY 深度展開的面試題

2021-09-16 22:16:32 字數 1493 閱讀 8276

今天面試的時候,考官出了這麼乙個題,寫乙個函式,輸入a = [1,[2,3,[4,5,6]]],輸出a = [1,2,3,4,5,6]。當時我腦子有點短路,做了好久,給出了個不太符合要求的答案如下

var a = [1,[2,3,[4,5,6]]]

var arr =

function merge(a) else

} return arr

}

回家後稍微完善了下,符合了考官輸入輸出的要求了(不過也晚了)

function flatten(a)  else 

}return arr

})(a)

}

然後跟朋友聊天問問有啥簡單的方法,朋友給了乙個挺符合這個題的簡單方法類似如下

const flatten = (arr) => arr.tostring().split(',').map(v => number(v))
不過這個答案只適用於這道題,如果不是全數字的就不行了。於是在github上搜尋array flatten,看了看排名前三的原始碼,發現有好多不同的寫法,比如

function flatten()  while (args.some(array.isarray))

return args

}

也有這麼寫的

function flatten (array) 

return flatten(result)

}

寫法各不相同,還有好多看似類似,但細節上不一樣的,所以關鍵就看效能了,好在arr-flatten和array-flatten中就都有benchmark,進行了各種比較

arr-flatten這個專案中,在各種不同的、可以在 npm 上搜到的array flatten實現方法之間進行了比較,最後的結論是array-flatten執行的效率最高

array-flatten專案裡的benchmark主要是自己原始碼中細節不同的寫法之間的差異,最後得出的最佳實踐如下

function flatten (array) 

return flattenfrom(array)

}function flattenfrom (array)

function flattendown (array, result) else

} return result

}

這套**思路與我給出的答案是一樣的,但由於細節上的不同,導致用benchmark測試,執行效率比我寫的那個快了約20%

一道關於訊號的題

用fork建立兩個子程序,呼叫signal 讓父程序接收鍵盤上的中斷訊號 control c 捕捉到訊號後父程序用kill 向子程序傳送自定義訊號,子程序捕捉到訊號後分別輸出如下資訊後終止 child process 1 is killed by parent child process 2 is ...

360一道關於this的題目

原題目是這樣子的 window.val 1 var obj 說出下面的輸出結果 obj.dbl var func obj.dbl func this呢其實就是這樣,分清楚呼叫就好了。obj中的沒有指定呼叫。預設從函式中查詢。如果沒有則往上一級查詢。所以 上面的式子可以寫成這樣 window.val ...

一道關於矩陣的題

wzz的視察 檔名 inspect 時限 1s 記憶體 256mb decription wzz擁有乙個王國。他的王國是長方形的,跨越了n個維度區和m個經度區,且在每個經度區和緯度區的交界處有一座城市 即wzz的王國一共有n m座城市 某一天早上,wzz從他的一萬平方公尺的大床上起來,他決定去視察一...