阿里巴巴 筆試前的測驗題 星球大戰

2021-08-19 19:03:58 字數 3401 閱讀 6413

阿里筆試前的程式設計測驗題,具體的題目要求很長,我已經給忘記了

maps = [[1, 1, 0, 1, 1, 0, 0],

[1, 0, 1, 1, 0, 0, 1],

[1, 1, 1, 1, 1, 1, 1],

[0, 1, 0, 1, 0, 1, 1],

[1, 0, 1, 1, 1, 1, 0],

[1, 1, 0, 1, 1, 0, 1]]

讓你選擇乙個位置,這個位置必須是1,而且從這個位置出發(上,下,左,右)可以打到飛機數最多,1代表飛機,0代表隕石(不可到達),輸出的結果要求是乙個座標資訊,如果存在相同的結果,應該都輸出出來。

很顯然,使用暴力解法時間複雜度為o(n3), 在這裡採用動態規劃思想,時間複雜度為o(n2),從上下左右四個方向出發,分別代表乙個單維的陣列進行dp操作。

# @time   :2018/5/8

# @author :liuyinxing

maps = [[1, 1, 0, 1, 1, 0, 0],

[1, 0, 1, 1, 0, 0, 1],

[1, 1, 1, 1, 1, 1, 1],

[0, 1, 0, 1, 0, 1, 1],

[1, 0, 1, 1, 1, 1, 0],

[1, 1, 0, 1, 1, 0, 1]]

n, m = 6, 7 # 行列

dp1 = [[0]*m for _ in range(n)] # 上

dp2 = [[0]*m for _ in range(n)] # 右

dp3 = [[0]*m for _ in range(n)] # 下

dp4 = [[0]*m for _ in range(n)] # 左

for i in range(m): dp1[0][i], dp3[n-1][i] = maps[0][i], maps[n-1][i] # 初始化

for i in range(n): dp2[i][m-1], dp4[i][0] = maps[i][m-1], maps[i][0]

for i in range(n): # 從左--->右計算

for j in range(1, m):

dp4[i][j] = 0 if maps[i][j] == 0 else dp4[i][j-1] + maps[i][j]

for i in range(n): # 從右--->左計算

for j in range(m-2, -1, -1):

dp2[i][j] = 0 if maps[i][j] == 0 else dp2[i][j+1] + maps[i][j]

for j in range(m): # 從上--->下計算

for i in range(1, n):

dp1[i][j] = 0 if maps[i][j] == 0 else dp1[i-1][j] + maps[i][j]

for j in range(m): # 從下--->上計算

for i in range(n-2, -1, -1):

dp3[i][j] = 0 if maps[i][j] == 0 else dp3[i+1][j] + maps[i][j]

idm = 0

pathid =

for i in range(n): # 獲取結果

for j in range(m):

dp1[i][j] = dp1[i][j] + dp2[i][j] + dp3[i][j] + dp4[i][j] - (3*maps[i][j])

if dp1[i][j] > idm: # 更新最大值

idm, pathid= dp1[i][j], [[i,j]]

elif dp1[i][j] == idm: # 保留最大值

print(pathid)

程式簡化一下:

# @time   :2018/5/8

# @author :liuyinxing

maps = [[1, 1, 0, 1, 1, 0, 0],

[1, 0, 1, 1, 0, 0, 1],

[1, 1, 1, 1, 1, 1, 1],

[0, 1, 0, 1, 0, 1, 1],

[1, 0, 1, 1, 1, 1, 0],

[1, 1, 0, 1, 1, 0, 1]]

n, m = 6, 7 # 行列

dp1 = [[0]*m for _ in range(n)] # 上

dp2 = [[0]*m for _ in range(n)] # 右

dp3 = [[0]*m for _ in range(n)] # 下

dp4 = [[0]*m for _ in range(n)] # 左

for i in range(m): dp1[0][i], dp3[n-1][i] = maps[0][i], maps[n-1][i] # 初始化

for i in range(n): dp2[i][m-1], dp4[i][0] = maps[i][m-1], maps[i][0]

for i in range(n): # 一行一行的計算

for j in range(1, m): # 從左--->右計算

dp4[i][j] = [0, dp4[i][j-1] + maps[i][j]][maps[i][j]]

for j in range(m-2, -1, -1): # 從右--->左計算

dp2[i][j] = [0, dp2[i][j+1] + maps[i][j]][maps[i][j]]

for j in range(m): # 一列一列的計算

for i in range(1, n): # 從上--->下計算

dp1[i][j] = [0, dp1[i-1][j] + maps[i][j]][maps[i][j]]

for i in range(n-2, -1, -1): # 從下--->上計算

dp3[i][j] = [0, dp3[i+1][j] + maps[i][j]][maps[i][j]]

idm = 0

pathid =

for i in range(n): # 獲取結果

for j in range(m):

dp1[i][j] = dp1[i][j] + dp2[i][j] + dp3[i][j] + dp4[i][j] - (3*maps[i][j])

if dp1[i][j] > idm: # 更新最大值

idm, pathid= dp1[i][j], [[i,j]]

elif dp1[i][j] == idm: # 保留最大值

print(pathid)

2015阿里巴巴筆試題第二題

題目 寫乙個函式,輸入乙個二叉樹,樹中每個節點存放了乙個整數值,函式返回這棵二叉樹中相差最大的兩個節點間的差值絕對值。請注意程式效率。節點結構體 struct btnode 返回最大值和最小值的函式 int max int l int r int min int l,int r 方法一 int fi...

阿里巴巴歷年筆試面試70題 6 10

6 25匹賽馬,5個跑道,也就是說每次有5匹馬可以同時比賽。問最少比賽多少次可以知道跑得最快的5匹馬。將馬分成a b c d e五組。第1 5次比賽 各組分別進行比賽,決出各組名次 a1 a2 a3 a4 a5,b1 b2 b3 b4 b5,e4 e5。第6次比賽 a1 b1 c1 d1 e1,第一...

2023年 阿里巴巴演算法筆試第二題

第二題 菜鳥倉庫是乙個很大很神奇的地方,各種琳琅滿目的商品整整齊齊地擺放在一排排貨架上,通常一種品類 sku 的商品會放置在貨架的某乙個格仔中,格仔設有統一的編號,方便工人們揀選。有一天沐哲去菜鳥倉庫參觀,無意中發現第1個貨架格仔編碼為1,第2 3個分別為1,2,第4 6個格仔分別是1,2,3,第7...