聊聊我的一次真實 Python 面試經歷

作者:SyntaxError
出處:segmentfault.com/a/1190000022455160
首先我挺喜歡這家公司的面試風格的,也是比較務實的吧。無奈自己的心理因素和技術水平都不好,導致面試失敗。再接再厲吧
1.一上來就是編程題三連
1.1 大概意思就是:倆列表a b,如果a中的元素在b中,那么就保存此元素在a中的索引值,最后統(tǒng)一輸出所有索引值。要求:時間復雜度小于O(n)

這個我當時想到的是循環(huán)遍歷a,然后判斷是否i in b,但是這個時間復雜度是O(n2),GG。最后面試官提醒了我一下hashmap,瞬間捶胸頓足……。最后自己想了一下,可以將b先轉成字典,然后再使用in。
a?=?[5,3,1,5,4]
b?=?[5,3]
d?=?{}
for?i?in?b:
????d[i]?=?0
res?=?[]
l?=?len(a)
for?i?in?range(l):
????if?a[i]?in?d:
????????res.append(i)
print(res)
1.2 如圖,輸入為這樣,輸出為那樣,寫吧……
輸入幾組數據,pid為-1的代表根節(jié)點。如果數據為非根節(jié)點,那么就要搜索此節(jié)點直至找到根節(jié)點。

這個其實我知道考的是樹的遍歷,但是沒見過這種形式的題,要自己構建輸入數據的形式,一下子就懵了,再加上面試官在那一直盯著……唉,承認自己能力不足吧。后續(xù)自己寫了一遍,大家可以看一下,有問題直接下面評論就可以。
d?=?{
????"A":"-1",
????"A-1":"A",
????"A-2":"A",
????"A-3":"A",
????"A-2-1":"A-2",
????"A-2-2":"A-2",
????"A-2-3":"A-2"
}
res?=?[]
def?func(node):
????array.append(node[0])
????if?node[1]?==?"-1":
????????return
????func((node[1],d[node[1]]))
for?i?in?d.items():
????array?=?[]
????func(i)
????string?=?"/".join(array[::-1])
????res.append("/"+string)
for?j?in?res:
????print(j)
1.3 這個題太經典了。最短路徑和。

要注意是從第一行走到最后一行,而且只能向下或者斜向下走(我當時沒看清就寫,寫成了從左上走到右下……)。我這里寫的是動態(tài)規(guī)劃的解法。Leetcode上有原題,解法不唯一。
array?=?[[1,8,5,2],
?????????[4,1,7,3],
?????????[3,6,2,9]]
x?=?len(array)
y?=?len(array[0])
dp?=?[[0?for?i?in?range(y)]?for?j?in?range(x)]
#?遍歷順序是每行內的每列。所以遍歷array中第一行只執(zhí)行到if,dp中第一行就確定了,然后再確定dp第二行。
#?要注意兩個邊界條件
for?i?in?range(x):
????for?j?in?range(y):
????????if?i?==?0:
????????????dp[i][j]?=?array[i][j]
????????elif?j?==?0:
????????????dp[i][j]?=?array[i][j]?+?min(dp[i-1][j],?dp[i-1][j+1])
????????elif?j?==?y-1:
????????????dp[i][j]?=?array[i][j]?+?min(dp[i-1][j-1],dp[i-1][j])
????????else:
????????????dp[i][j]?=?array[i][j]?+?min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])
#?[[1,?8,?5,?2],?
#??[5,?2,?9,?5],?
#??[5,?8,?4,?14]]
print(min(dp[-1]))
#?4
2.其他面試問題
這里就不寫答案了,大家可以百度或google一下。
2.1 什么是事務,事務的出現是為了解決什么問題
2.2 什么是聚簇索引
2.3 假如沒有主鍵,InnoDB會以哪個字段建立主鍵
2.3 聊聊RabbitMQ中的connection與channel的關系,還有建立channel的一些規(guī)范或注意事項。
好文章,我在看??
