自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

新聞 算法
前幾天有個(gè)小伙伴去面試字節(jié)跳動(dòng),面試官問了他一道鏈表相關(guān)的算法題,不過他一時(shí)之間沒做出來,就來問了我一下,感覺這道題還不錯(cuò),拿來講一講。

前幾天有個(gè)小伙伴去面試字節(jié)跳動(dòng),面試官問了他一道鏈表相關(guān)的算法題,不過他一時(shí)之間沒做出來,就來問了我一下,感覺這道題還不錯(cuò),拿來講一講。

[[275586]]

01 題目

這其實(shí)是一道變形的鏈表反轉(zhuǎn)題,大致描述如下:

給定一個(gè)單鏈表的頭節(jié)點(diǎn) head,實(shí)現(xiàn)一個(gè)調(diào)整單鏈表的函數(shù),使得每K個(gè)節(jié)點(diǎn)之間為一組進(jìn)行逆序,并且從鏈表的尾部開始組起,頭部剩余節(jié)點(diǎn)數(shù)量不夠一組的不需要逆序。(不能使用隊(duì)列或者棧作為輔助)。

例如:

  • 鏈表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一組。調(diào)整后:1->2->5->4->3->8->7->6->null。其中 1,2不調(diào)整,因?yàn)椴粔蛞唤M。

02 解答

這道題的難點(diǎn)在于,是從鏈表的尾部開始組起的,而不是從鏈表的頭部,如果是頭部的話,那我們還是比較容易做的,因?yàn)槟憧梢员闅v鏈表,每遍歷 k 個(gè)就拆分為一組來逆序。但是從尾部的話就不一樣了,因?yàn)槭菃捂湵恚荒芡蟊闅v組起,不過這道題肯定是用遞歸比較好做。

先做一道類似的反轉(zhuǎn)題

在做這道題之前,我們不仿先來看看如果從頭部開始組起的話,應(yīng)該怎么做呢?例如:鏈表:1->2->3->4->5->6->7->8->null, K = 3。調(diào)整后:3->2->1->6->5->4->7->8->null。其中 7,8不調(diào)整,因?yàn)椴粔蛞唤M。

這道題我們可以用遞歸來實(shí)現(xiàn),假設(shè)方法reverseKNode()的功能是將單鏈表的每K個(gè)節(jié)點(diǎn)之間逆序(從頭部開始組起的哦);reverse()方法的功能是將一個(gè)單鏈表逆序。

那么對于下面的這個(gè)單鏈表,其中 K = 3。

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

我們把前K個(gè)節(jié)點(diǎn)與后面的節(jié)點(diǎn)分割出來:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

temp指向的剩余的鏈表,可以說是原問題的一個(gè)子問題。我們可以調(diào)用reverseKNode()方法將temp指向的鏈表每K個(gè)節(jié)點(diǎn)之間進(jìn)行逆序。再調(diào)用reverse()方法把head指向的那3個(gè)節(jié)點(diǎn)進(jìn)行逆序,結(jié)果如下:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

接著,我們只需要把這兩部分給連接起來就可以了。最后的結(jié)果如下:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

代碼如下:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

回到本題

這兩道題可以說是及其相似的了,只是一道從頭部開始組起,這道從頭部開始組起的,也是 leetcode 的第 25 題。而面試的時(shí)候,經(jīng)常會(huì)進(jìn)行變形,例如這道字節(jié)跳動(dòng)的題,它變成從尾部開始組起,可能你一時(shí)之間就不知道該怎么弄了。當(dāng)然,可能有人一下子就反應(yīng)出來,把他秒殺了。

其實(shí)這道題很好做滴,你只需要先把單鏈表進(jìn)行一次逆序,逆序之后就能轉(zhuǎn)化為從頭部開始組起了,然后按照我上面的解法,處理完之后,把結(jié)果再次逆序即搞定。兩次逆序相當(dāng)于沒逆序。

例如對于鏈表(其中 K = 3)

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

我們把它從尾部開始組起,每 K 個(gè)節(jié)點(diǎn)為一組進(jìn)行逆序。步驟如下:

① 先進(jìn)行逆序

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

逆序之后就可以把問題轉(zhuǎn)化為從頭部開始組起,每 K 個(gè)節(jié)點(diǎn)為一組進(jìn)行逆序。

② 處理后的結(jié)果如下:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

③ 接著在把結(jié)果逆序一次,結(jié)果如下:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

代碼如下:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

類似于這種需要先進(jìn)行逆序的還要兩個(gè)鏈表相加,這道題字節(jié)跳動(dòng)的筆試題也有出過,如下圖的第二題:

一道字節(jié)跳動(dòng)的算法面試題,你能做出來嗎?

這道題就需要先把兩個(gè)鏈表逆序,再節(jié)點(diǎn)間相加,最后在合并了。

03 總結(jié)

關(guān)于鏈表的算法題,在面試的時(shí)候聽說是挺??嫉?,大家可以多注意注意。如果你覺得這篇內(nèi)容對你挺有啟發(fā),那就點(diǎn)個(gè)贊唄~

 

責(zé)任編輯:未麗燕 來源: 簡書
相關(guān)推薦

2022-04-08 07:52:17

CSS面試題HTML

2009-08-11 10:12:07

C#算法

2009-08-11 14:59:57

一道面試題C#算法

2024-10-11 17:09:27

2009-08-11 15:09:44

一道面試題C#算法

2011-05-23 11:27:32

面試題面試java

2018-03-06 15:30:47

Java面試題

2021-10-28 11:40:58

回文鏈表面試題數(shù)據(jù)結(jié)構(gòu)

2023-02-04 18:24:10

SeataJava業(yè)務(wù)

2025-03-20 08:40:00

TCPUDP端口

2021-05-31 07:55:44

smartRepeatJavaScript函數(shù)

2017-11-21 12:15:27

數(shù)據(jù)庫面試題SQL

2023-08-01 08:10:46

內(nèi)存緩存

2013-05-29 10:36:08

Android開發(fā)移動(dòng)開發(fā)字符串反轉(zhuǎn)

2021-03-16 05:44:26

JVM面試題運(yùn)行時(shí)數(shù)據(jù)

2022-02-08 18:09:20

JS引擎解析器

2011-03-02 10:58:16

SQL server入門面試題

2015-09-02 14:09:19

面試題程序設(shè)計(jì)

2017-03-10 09:33:16

JavaScript類型

2020-11-06 09:05:18

前端web開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號