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...