面試基本資料結構和演算法

2021-10-01 17:25:13 字數 4190 閱讀 1703

2. 二叉樹

3. 鍊錶反轉

def

quick_sort

(li, start, end)

:# 分治 一分為二

# start=end ,證明要處理的資料只有乙個

# start>end ,證明右邊沒有資料

if start >= end:

return

# 定義兩個游標,分別指向0和末尾位置

left = start

right = end

# 把0位置的資料,認為是中間值

mid = li[left]

while left < right:

# 讓右邊游標往左移動,目的是找到小於mid的值,放到left游標位置

while left < right and li[right]

>= mid:

right -=

1 li[left]

= li[right]

# 讓左邊游標往右移動,目的是找到大於mid的值,放到right游標位置

while left < right and li[left]

< mid:

left +=

1 li[right]

= li[left]

# while結束後,把mid放到中間位置,left=right

li[left]

= mid

# 遞迴處理左邊的資料

quick_sort(li, start, left-1)

# 遞迴處理右邊的資料

quick_sort(li, left+

1, end)

if __name__ ==

'__main__'

: l =[6

,5,4

,3,2

,1]# l = 3 [2,1,5,6,5,4]

# [2, 1, 5, 6, 5, 4]

quick_sort(l,0,

len(l)-1

)print

(l)# 穩定性:不穩定

# 最優時間複雜度:o(nlogn)

# 最壞時間複雜度:o(n^2)

def

heapify

(arr, n, i)

: largest = i

l =2* i +

1# left = 2*i + 1

r =2* i +

2# right = 2*i + 2

if l < n and arr[i]

< arr[l]

: largest = l

if r < n and arr[largest]

< arr[r]

: largest = r

if largest != i:

arr[i]

,arr[largest]

= arr[largest]

,arr[i]

# 交換

heapify(arr, n, largest)

defheapsort

(arr)

: n =

len(arr)

# build a maxheap.

for i in

range

(n,-1,

-1):

heapify(arr, n, i)

# 乙個個交換元素

for i in

range

(n-1,0

,-1)

: arr[i]

, arr[0]

= arr[0]

, arr[i]

# 交換

heapify(arr, i,

0)

def

levelorder

(root)

: res,queue=

,[root]

ifnot root:

return res

while queue:

node=queue.pop(0)

if node.left:

if node.right:

return res

#前序遍歷

defpreorder

(root)

: res=

ifnot root:

return

none

preorder(root.left)

preorder(root.right)

return res

#中序遍歷

definorder

(root)

: res=

ifnot root:

return res

inorder(root.left)

inorder(root.right)

return res

#後序遍歷

deflastorder

(root)

: res=

ifnot root:

return res

lastorder(root.left)

lastorder(root.right)

return res

#非遞迴前序

defpreorder

(root)

: res,stack=

,[root]

ifnot root:

return res

while stack:

node=stack.pop(

)if node.right:

if node.left:

return res

#非遞迴中序

definorder

(root)

: stack=

node=root

res=

while stack or node:

while node:

node=node.left

node=stack.pop(

) node=node.right

return res

#非遞迴後序

deflastorder

(root)

: res=

ifnot root:

return

none

stack=

[root]

while stack:

node=stack.pop(

)if node.left:

if node.right:

return res[::

-1]

class

solution

:def

reverselist

(self, head: listnode)

-> listnode:

''' p,rev=head,none

while p:

rev,rev.next,p=p,rev,p.next

return rev

'''ifnot head or

not head.

next

:return head

pre=

none

while head:

tmp=head.

next

head.

next

=pre

pre=head

head=tmp

return pre

#遞迴方法

ifnot head or

not head.

next

:return head

new_node=self.reverselist(head.

next

) head.

next

.next

=head

head.

next

=none

return new_head

演算法 基本資料結構

1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...

php 基本資料結構 和 演算法

以下的格式不好看,或者到空間的 裡面看吧,那裡的格式規範些。希望對有需要的同學有點幫助吧 基本資料結構 二分查詢 有序陣列裡查詢某個元素 low為待查詢的陣列中的最小值,high為陣列中的最大值,k為要查詢的關鍵字 function bin sch array,low,high,k elseif k...

演算法學習 基本資料結構

資料型別 數值型別 函式定義 介面 注 定義乙個返回多值得函式 使用指標 cartesian coordinates to polar coordinates polar float x,float y,float r,float theta 案例 厄拉多塞篩 問題描述 定義乙個陣列array n ...