從快手筆試題x到y的次數看bfs解題技巧

2021-09-26 21:21:23 字數 1367 閱讀 1626

給定兩個-100到100的整數x和y,對x只能進行加1,減1,乘2操作,問最少對x進行幾次操作能得到y?

例如:a=3,b=11: 可以通過322-1,3次操作得到11;

a=5,b=8:可以通過(5-1)*2,2次操作得到8;

我們可以這樣來解這道題,計算出從a一步操作能夠得到幾,兩步操作能夠得到幾,三步操作能夠得到幾

如何來優化這個想法,兩步操作可以是一步操作後的結果再加一步操作。這裡的一步操作是指題中給的加一減一和乘二。

那麼問題就解決了:bfs的思想解決。

def bfs(queue,target):

while queue:

x = queue.pop(0)

if x[0]==target:

return x[1]

else:

if __name__=="__main__":

a,b = 3,11

queue =

print(bfs(queue,b))

queue儲存每一輪的結果,在下一輪中取出每乙個值進行相同的處理,之後儲存進queue以完成bfs功能。

x代表當前值,x代表操作次數。

我們再看這道題:

扭蛋機2號:如果塞x(x範圍為》=0正整數)個扭蛋進去,然後就可以扭到2x+1個

扭蛋機3號:如果塞x(x範圍為》=0正整數)個扭蛋進去,然後就可以扭到2x+2個

22娘和33娘手中沒有扭蛋,需要你幫她們設計乙個方案,兩人「輪流扭」(誰先開始不限,扭到的蛋可以交給對方使用),用「最少」的次數,使她們能夠最後恰好扭到n個交給小電視君。

輸入乙個正整數,表示小電視君需要的n個扭蛋。

輸出乙個字串,每個字元表示扭蛋機,字元只能包含"2"和"3"。

這是bilibili的一道演算法題,我們依然可以用上述**進行求解:

def bfs(queue,target):

while queue:

x = queue.pop(0)

if x[0]==target:

return x[1]

else:

n = int(input())

queue =

print(bfs(queue,n))

我們可以看到和上面快手那道題的**非常相像:他們都可以用bfs的思路把所有情況進行窮舉出來,一層一層的去找是否能夠達到目標,這段**具有正確的功能但是可惜bilibili使用的資料量很大不能夠在規定時間內跑完所有的樣例。

而這道題能跑完所有樣例的**很簡單,我們優化一下這段的**。我們從後向前進行bfs,並且當結果為偶數的時候一定是扭蛋機3,結果是基數的時候為扭蛋機2.這樣的話就可以在規定時間內跑完這些**了。

9 10快手筆試

由於太過興奮,晚上月神做了乙個奇怪的夢,月神夢見自己掉進了乙個被施法的深淵,月神想要爬出此深淵。已知深淵由n級台階構成 1 n 1000 並且每次月神僅可往上爬2的整數次冪個台階 1,2,4,由你程式設計告訴月神,月神有多少種方法爬出深淵 輸入描述 輸入m行,1第一行輸入乙個數表述有多少組測試用例 ...

2018 快手筆試題latex愛好者

latex自然是廣大研究人員最喜歡使用的科研 排版工具之一。月神想在iphone 上查閱寫好的 但是無賴iphone 上沒有月神喜歡使用的閱讀軟體,於是月神也希望像tex老爺爺donald knuth那樣自己動手do it yourself乙個。在diy這個閱讀軟體的過程中,月神碰到乙個問題,已知i...

2018 9 快手筆試程式設計題

題目描述 給你二叉樹的先序和中序遍歷的值,求出中序遍歷的求和樹。每個節點的和等於其左右孩子節點的value的和。思路 先建樹,直接遞迴求和輸出就好了。我簡化了輸入,原題的輸入是字串輸入,當時一直段錯誤,卡了快乙個小時,這個 能過樣例,不知道能不能過全部的資料。include include incl...