劍指offer Python3版 九

2021-10-23 19:48:42 字數 3526 閱讀 6210

q: 請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null

思路

複製鍊錶

cur    a-b-c

cloned a'-b'

-c'

複製的鍊錶依次加到原煉表後

a-a'-b-b'

-c-c'

複製原鍊錶的random節點後,再分離就得到了複製的鍊錶

class

solution

:def

copyrandomlist

(self, head:

'node')-

>

'node'

:"""

複雜鍊錶的複製

@param head:

@return:

"""defclone_nodes

(head)

: cur = head

while cur:

# 複製

cloned = node(cur.val,

none

,none

)# 建立

cloned.

next

= cur.

next

# 鏈結

cur.

next

= cloned

# cur指向下乙個,(例如第一次就是指向b) 給下一次迴圈用,單看不理解,結合上面的cloned.next = cur.next

cur = cloned.

next

defconnect_random_nodes

(head)

:# a的random指向b,那a的複製節點a'的random也要指向b的複製節點b'

cur = head

while cur:

if cur.random:

cur.

next

.random = cur.random.

next

else

: cur.

next

.random =

none

cur = cur.

next

.next

defreconnect_node

(head)

:# 拆分為兩個鍊錶,奇數字的節點用next連線起來就是原始鍊錶

# 偶數字節點用next鏈結起來就是複製的鍊錶

ifnot head:

return head

cur = head

newhead = cloned = cur.

next

while cur:

cur.

next

= cloned.

next

cur = cur.

next

cloned.

next

= cur.

next

if cur else

none

cloned = cloned.

next

return newhead

clone_nodes(head)

connect_random_nodes(head)

return reconnect_node(head)

q: 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

思路

中序遍歷

def

dfs(root):if

not root:

return

dfs(root.left)

print

(root)

dfs(root.right)

實現

class

solution

:def

treetodoublylist

(self, root:

'node')-

>

'node'

:def

dfs(cur)

:# 中序遍歷

ifnot cur:

return

dfs(cur.left)

if self.pre:

self.pre.right, cur.left = cur, self.pre

else

:# 儲存cur

self.head = cur

self.pre = cur

dfs(cur.right)

ifnot root:

return

self.pre =

none

dfs(root)

# 因為要雙向迴圈排序鍊錶 頭尾互相連線 head是頭結點,pre是尾結點

self.head.left, self.pre.right = self.pre, self.head

return self.head

q: 輸入乙個字串,列印出該字串中字元的所有排列。

輸入:s = "abc"

輸出:["abc","acb","bac","bca","cab","cba"]

class

solution

:def

permutation

(self, s:

str)

-> list[

str]

: c, res =

list

(s),

defdfs

(x):

if x ==

len(c)-1

:''.join(c)

)# 新增排列方案

return

dic =

set(

)for i in

range

(x,len

(c))

:if c[i]

in dic:

continue

# 重複,剪枝

dic.add(c[i]

) c[i]

, c[x]

= c[x]

, c[i]

# 交換,將 c[i] 固定在第 x 位

dfs(x +1)

# 開啟固定第 x + 1 位字元

c[i]

, c[x]

= c[x]

, c[i]

# 恢復交換

dfs(0)

return res

劍指offer Python3版 五

q 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。你要是這樣寫 class solution def reorderarray self,list1 evenlist,oddli...

劍指offer Python3實現

使用python3編寫 劍指offer 所有演算法,在參考牛客網,劍指offer書本以及其他前輩所寫的程式的同時,也加入了自己的解題思路,力爭用簡單的語言描述清楚。所有的程式均已上傳到github,之後將持續整理更新,題目的順序與牛客網基本一致。原始碼位址 試題 3 二維陣列中的查詢 試題 4 替換...

劍指offer Python版 替換空格

問題1 替換字串,是在原來的字串上做替換,還是可以重新定義乙個字串做替換 問題2 從前往後替換和從後往前替換一樣嗎?從左往右遍歷元素,若當前元素為空格,則插入 20 並將字串長度增加3.時間複雜度o n n coding utf 8 class solution s 源字串 def replaces...