# 阿里巴巴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 的時間去完成匹配 時...