題目:
樣例:
**:
n = 4 # 結點數
pairs = [[1,2],[3,4],[3,1]] # 邊
child = [-1,2,0,1,0] # 孩子數 1-n 多加了個-1為了填充index=0
query = [[1,3],[4,1],[2,4]] # 查詢對
fa = list(range(0,n+1)) # 用來查詢當前父親,與並查集相同, pre[i] = i 初始化
graph = [[0]*(n+1) for _ in range(n+1)] # 邊圖
for x1,x2 in pairs:
graph[x1][x2] = 1 # 把其變成無向圖
graph[x2][x1] = 1
sum1 = 0 # 用來判斷當前狀態
'''這裡每一次只找當前的孩子(child[i]==0)的結點,將其與之相連的點j,若還有孩子數,將其設為其父親,
並且將父親結點的孩子數child[j] -= 1,並將child[i] 設為-1,
如果所有結點為-1,即child和為-n,說明樹設定完成,sum1是用來判斷是否找完。
'''while sum1 != -n:
sum1 = 0
for i in range(1,n+1):
if child[i] == 0:
for j in range(1,n+1):
if graph[i][j] == 1 and child[j] > 0:
fa[i] = j
child[j] -= 1
break # 只會有乙個父親
child[i] = -1
sum1 += child[i]
'''--------------------------------------分割線------------------------------------------
下面開始設定查詢步驟,
1、findpre 找到當前結點祖先的列表,並翻轉便於搜尋
2、findnearpre 判斷兩點關係。
'''def findpre(u):
fathers =
while u != fa[u]:
u = fa[u]
fathers.reverse()
return fathers
def findnearpre(u, v):
u_list = findpre(u)
v_list = findpre(v)
if u in v_list:
return 'zzzz'
elif v in u_list:
return 'ssss'
else:
# 查詢最後相等的結點值
for i in range(0,min(len(u_list),len(v_list))):
if u_list[i] != v_list[i]:
return u_list[i-1]
else:
cur = u_list[i]
return cur
for u,v in query:
print(findnearpre(u,v))
阿里7月17日筆試題
第一題 這題沒寫出來qaq,我知道如何求x ab的最大值,ab的值是多少 給定乙個數x,資料對 a,b 使得a b x能達到最大,求使 a b 最小的方案總數有多少。x,a,b的範圍都是0 2 31 次方 第二題 賣粽子 典型的揹包問題 小明要賣粽子,有m種粽子,n克麵粉,多種餡料,求做出的粽子能夠...
2023年9月26日微軟筆試題
一 選擇題 10個,答對得4分,不答得0分,答錯得 1分 question 1 合併兩個已排好序的陣列在最壞情況下需要比較多少次?a 2n b 2n 1 c 2n 1 d 2n 2 e none of above question 2 question 3 question 4 question 5...
2023年9月16日 暴風影音筆試題
1 根據二叉樹的前序遍歷和中序遍歷退出二叉樹的布局並畫出二叉樹,寫出此樹的後序遍歷以及後序遍歷程式 2 將旋轉90度 3 找出兩個字串中最長的公共字串 如 abcdef 和 yiewcdeacd 則輸出 cde 4 tcp建立的三次握手,並說明為什麼要進行三次握手,並說明第二次連線中斷後會怎樣 5 ...