"""
我當時用的是python的內建函式,現在想想應該自己實現乙個堆排序的,這個才是最好的排序方式
堆排序裡面的儲存結構是陣列 邏輯結構是二叉樹
"""def heapsortmax(lst, n):
# 找出最大值登頂對頂
# n = len(lst)
if n <= 1:
return lst
depth = n // 2 - 1 # 這個深度是0~depth
# 下面開始調整堆 從最後乙個非終端節點開始調整
for i in range(depth, -1, -1):
topmax = i
leftchild = 2 * i + 1
rightchild = 2 * i + 2 # 左右孩子節點
# 從這三個節點裡面選出最大值 還要不能越界才得行
if leftchild <= n - 1 and lst[leftchild] > lst[topmax]:
topmax = leftchild
if rightchild <= n - 1 and lst[rightchild] > lst[topmax]:
topmax = rightchild
if i != topmax:
lst[topmax], lst[i] = lst[i], lst[topmax]
return lst
def heapsort(lst):
n = len(lst)
for i in range(n):
lastmesslen = n - i
# 每次登頂了陣列長度就少了乙個了
heapsortmax(lst, lastmesslen)
# print(lst)
if i < n:
lst[0], lst[lastmesslen - 1] = lst[lastmesslen - 1], lst[0]
# 這個位置為什麼是lastmesslen-1呢?道理很簡單
# 最後乙個元素本來就是lastmesslen-1,lastmesslen已經越界了
# print("ex", lst)
return lst
if __name__ == "__main__":
lst = [3, 1, 5, 4, 7, 6, 8, 0]
# lst = heapsortmax(lst)
lst = heapsort(lst)
print(lst)
def func(str):
dic = {}
for el in str:
if dic.get(el):
dic[el] = dic[el] + 1
else:
dic[el] = 1
key, value = "", 0
for item in dic.items():
if item[1] > value:
value = item[1]
key = item[0]
return key, value
趣味面試題第一組
第一組 1.燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時乙個小時十五分鐘呢?2.你有一桶果凍,其中有黃色 綠色 紅色三種,閉上眼睛抓取同種顏色的兩個。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?4.乙個岔路口分別通向誠實國和說謊國。來了兩個人...
面試題 k個一組翻轉單鏈表
鍊錶中的節點每k個一組翻轉 注意點 對於上面注意點的第三條,要封裝的函式如下 注意下面的函式是左閉右開即只翻轉綠色的部分 翻轉一段鍊錶 左閉右開 翻轉從start到end之間的鍊錶 public listnode reverselist listnode start,listnode end ret...
經典面試題 k節點一組旋轉鍊錶
題目 給出乙個鍊錶和乙個數k,比如鍊錶1 2 3 4 5 6,k 2,則翻轉後2 1 4 3 6 5,若k 3,翻轉後3 2 1 6 5 4,若k 4,翻轉後4 3 2 1 5 6。如果節點的數量是不k的倍數則最終留出節點應該保持原樣,每k個一反轉,不到k個不用反轉。用程式實現。美團校招 來自lee...