javascript 前端 有關陣列的面試題

2021-07-31 07:07:21 字數 3080 閱讀 6805

陣列相關api常用的不多(es5/6/7新增部分,使用時需要注意相容性),也簡單易懂,但組合使用起來會很靈活,出題方式多,向面試者描述也很容易被理解。

如果能熟練應用,平時寫**的效率也能提高不少,經驗相對豐富的前端開發不可避免地會經常與資料打交道。總結起來就是很適合做面試題。。。

開始之前先推薦超實用的工具庫lodash,提供了很多實用的工具函式。

以下**使用es6語法,新版chrome瀏覽器可以直接執行,不需要babel編譯。

// 一、將字串反向 'abc123' => '321cba'

// 很多不熟悉陣列api的小夥伴會回答 for迴圈。。。迴圈當然是可以的,兩年前我也這麼回答。。

// 加分回答

'abc123'

.split(''

).reverse()

.join(''

)

// 二、打平巢狀陣列 [1, [2, [3], 4], 5] => [1, 2, 3, 4, 5]

// 我現場寫的**:

const arr =[1

,[2,

[3],

4],5

]function

flatten

(arr)

}return arr

}flatten

(arr)

// 偶然發現 arr.tostring() 或 arr.join() => '1,2,3,4,5'

// 於是可以寫的簡便些

const arr =[1

,[2,

[3],

4],5

]arr.

join()

.split

(',').

map(it =>

number

(it)

)// 網上搜了下,還可以這麼寫。。。

const arr =[1

,[2,

[3],

4],5

]json

.parse(`[

$]`)// 這個題面試官想考查的應該是遞迴和深度優先遍歷,上面第

二、三種回答只適合應付元素為數字的場景,第一種回答討巧避開了深度優先遍歷過程,直接在原陣列上修改,並不推薦。

// 如果要有較好適應性,還是寫遞迴吧。同時可以參考下 [underscore flatten]( 的實現。

// 三、列印陣列全排列

// [1,2,3] => [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

// 沒有明確的遍歷界限時都使用遞迴吧,實際應用場景,若非尾遞迴形式需要考慮是否可能棧溢位。

// 採用遞迴需要重點考慮引數及返回值的設定,本例使用有***的方式實現,這樣實現邏輯上比較好理解,只有當滿足條件時新增一條排列,遞迴中的返回值用起來總感覺頭暈。。

function

allrange

(arr, path, res)

arr.

foreach

((v, idx)

=>)}

var a =[1

,2,3

,4]const b =

allrange

(a,[

], b)

console.

log(b)

//----------------------20190204更新-------------------

// 感覺上述**不夠優雅,後來覺得reduce很強大,於是嘗試重寫一下

console.

log([1

,2,3

,4].

reduce

((sum, p)

=>)}

return rs

},))

// reduce 函式執行過程

+1[[

1]]+

2[[2

1][1

2]]+

3[[3

21][

231]

[213

][31

2][1

32][

123]

]+4// ...

// 四、尋找兩個有序陣列最小相同元素

const a =[1

,2,5

,9,10

]const b =[3

,4,6

,9,10

]function

findelement

(a, b)

else

if(a[i]

> b[j]

)else

if(a[i]

< b[j])}

return

null

}console.

log(

findelement

(a, b)

)// => 9

// 看到這個題目第一想法是 遍歷第乙個陣列,二分法查詢第二個。經面試官提醒,採用游標,更加簡單易懂。

// 五、有序二維陣列尋找某元素座標

const data =[[

1,2,

5,9,

10],[

12,22,

35,49,

51],[

61,62,

75,79,

81]]const len = data[0]

.length

function

findoffset

(e, a, b)

else

if(e > data[y]

[x])

else

}findoffset(75

,0, len * data.length -1)

// => [2, 2]

// 看到這個題目第一想法是打平陣列使用indexof得到下標,再根據data[0].length對映到二維陣列的座標,只需要幾行**就能解決。

// 本題考的是二分查詢,相對一維陣列,多了乙個通過偏移量對映座標的過程。

前端初探 JavaScript

如果說html 是乙個簡單的靜態網頁,就像人素顏一樣。css樣式會讓頁面更加酷炫,就像化上妝一樣,js讓頁面可以動態變化,給頁面新增了動畫效果,檢測訪客的瀏覽資訊。事件繫結有三種 第一種 在html 標籤中進行事件繫結 在頁面中 function tnbclick 第二種 物件.事件 fn 例如do...

有關回文數

回文數 回文數 是一種數字.如 98789,這個數字正讀是98789,倒讀也是98789,正讀倒讀一樣,所以這個數字 就是回文數.任意某乙個數通過以下方式相加也可得到 如 29 92 121 還有 194 491 685,586 685 1271,1271 1721 2992 不過很多數還沒有發現此...

有關階乘問題(AC數)

eddy是個acmer,他不僅喜歡做acm題,而且對於ranklist中每個人的ac數量也有一定的研究,他在無聊時經常在紙上把ranklist上每個人的ac題目的數量摘錄下來,然後從中選擇一部分人 或者全部 按照ac的數量分成兩組進行比較,他想使第一組中的最小ac數大於第二組中的最大ac數,但是這樣...