阿里巴巴2018實習生 演算法工程師筆試題2

2021-08-19 21:45:56 字數 1438 閱讀 1076

# 阿里巴巴2018實習生-演算法工程師附加卷-程式設計題2(筆試時間2018-05-11 19:30)

# 解題思路 深度優先搜尋,用棧實現,符合的路徑一直入棧,直到找不到合適的新結點,然後出棧

# 每齣棧一次記錄一次路徑,出棧完成,則得出所有的路徑

# @time :2018/5/11

# @author :liuyinxing

import copy

def findallpath(one, node, path):

st = [[one, one, -1]] # 第乙個值表示,已經入棧的結點,第二個值表示下乙個結點的起始位置,最後乙個值表示下乙個結點已經擴充套件了幾次

sumpath = 0 # 記錄路徑數

while st: # 如果不為空

i, j, di, find = st[-1][0], st[-1][1], st[-1][2], 0 # 獲取棧頂資訊

i1, j1 = -1, -1 # 記錄下一步可走的座標

while di < node-1 and find == 0:

di += 1 # 下乙個結點

i1, j1 = j, di # 新的開始

if path[i1][j1] == 1: find = 1

if find == 1: # 找到新結點,入棧

st[-1][2] = di # 更新已經判斷過的結點

path[i1][j1] = 0 # 把路徑標記為不可走

else:

path[st[-1][0]][st[-1][1]] = 1 # 恢復可走路徑

sumpath += 1 # 記錄出棧幾次,也就是有幾條路徑

st.pop() # 出棧

return sumpath-1 # 第乙個入棧的不算要減去1

if __name__ == '__main__':

node = 4 # 輸入結點數

data = [[0, 1], [1, 2], [2, 3], [0, 2]] # 輸入路徑

maps = [[0] * node for _ in range(node)] # 轉換成鄰接矩陣(行是開始,列是結束)

for v in data: maps[v[0]][v[1]] = 1

maxpath, i = -1, -1 # 獲取最大路徑數, 和選擇的位置

for i in range(node): # 每個結點獲取一次最大路徑數

path = copy.deepcopy(maps)

tmppath = findallpath(i, node, path)

if tmppath > maxpath:

maxpath, i = tmppath, i

print('選擇開始位置:',i,'最大路徑數:', maxpath)

阿里巴巴2018實習生 演算法工程師筆試題2

阿里巴巴2018實習生 演算法工程師附加卷 程式設計題2 解題思路 運用鄰接表的思想。定義兩個字典,s pre存放前面路徑可以到達該路徑的結點編號,s after存放該路徑可以到達的結點編號。遍歷一遍所有的邊,得出結果。created on 2018年5月12日 author hobart s pr...

阿里巴巴2017實習生招聘筆試題 演算法工程師

一 考慮一種常見的撲克牌洗牌方法,是將撲克牌 54張 平均分成兩份,然後隨機的將兩份撲克牌隨機的合併到一起。請問 1 經過這樣一次洗牌之後,撲克牌的順序最多有多少種可能性?2 至少經過多少次這樣的洗牌之後,撲克牌的順序接近完全隨機?給出乙個合理的下限。參 二 某城市實行隨機化小汽車指標拍賣搖號,每月...

阿里巴巴暑期實習生筆試題

1.kmp演算法 長度為n的主串t中匹配長度為m的子串p n m 匹配成功 存在p的每個字元依次和t中的乙個連續字串行相等 輸出主串中匹配串起始位置,匹配失敗輸出 1 思路 首先用o m 的時間對子串進行預處理,可通過子串本身的特性判斷出需要右移幾位才是可能匹配的 然後用o n 的時間去完成匹配 時...