貝殼找房 9月7日 筆試題 第四題 查族譜

2021-10-24 10:53:31 字數 1767 閱讀 5461

題目:

樣例:

**:

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