我正在練習 CodingBat 并嘗試以下問題:
我們想要制作一排目標英寸長的磚塊。我們有許多小磚(每個 1 英寸)和大磚(每個 5 英寸)。如果可以通過從給定的磚塊中選擇來實作目標,則回傳 True。
測驗用例:
make_bricks(3, 1, 8)→Truemake_bricks(3, 1, 9)→Falsemake_bricks(3, 2, 10)→Truemake_bricks(7, 1, 13)→Falsemake_bricks(1, 4, 12)→False
當我在代碼編輯器(VSCode)上運行我的代碼時,我通過了每個測驗用例,但是當我在 CodingBat(https://codingbat.com/prob/p118406)上提交時,我得到了超時錯誤。請任何人解釋我的原因或下面的代碼中是否有任何錯誤:
def make_bricks(small, big, goal):
myNum = 5
result = 0
i = 1
for i in range(big 1):
if (i * myNum) == goal:
return True
elif (i * myNum) > goal:
result = ((i * myNum) - myNum)
elif (i * myNum) < goal:
result = (i * myNum)
for i in range(small 1):
if result i == goal:
return True
return False
print(make_bricks(20, 0, 19))
uj5u.com熱心網友回復:
您可以在沒有回圈的情況下計算它。回圈花費了太多時間。一些簡單的算術和一些快速的早期檢查應該可以解決這個問題:
def make_bricks(small, big, goal):
big_ = big * 5
max_ = big_ small
if goal > max_:
return False # impossible
if goal == max_:
return True # simple case - just use all the bricks
if big_ > goal:
big_ = goal // 5 * 5
return big_ small >= goal
uj5u.com熱心網友回復:
超時發生在這個測驗用例中:
make_bricks(2, 1000000, 100003)
這可能是因為處理測驗用例需要很多時間。在上面的測驗用例中,代碼迭代了超過一百萬次,并且在每次迭代中,它都將數字相乘并將結果存盤到result前 999.999 個回圈中不使用:
elif (i * myNum) < goal:
result = (i * myNum)
您可以在沒有回圈的情況下進行計算:
def make_bricks(small_bricks_available, big_bricks_available, goal):
big_brick_size = 5
small_brick_size = 1
if goal < big_brick_size:
return small_bricks_available >= goal
big_bricks_needed = goal // big_brick_size
if big_bricks_needed > big_bricks_available:
big_bricks_needed = big_bricks_available
goal -= big_bricks_needed * big_brick_size
small_bricks_needed = goal // small_brick_size
# the first comparison is not necessary, but I left it for clarity
return big_bricks_available >= big_bricks_needed and small_bricks_available >= small_bricks_needed
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453401.html
