[Lidemy 學習筆記]-先別急著寫 leetcode //#1008 幾個水桶解題過程

甜不辣馬拉松
5 min readJan 6, 2021
目錄
1.寫在之前
2.前情提要
3.開始解題
3.1題目理解
3.2先寫第一個版本(Runtime Error)
3.3已修正 tmp 變數初始化(Time Limit Exceeded)
3.4已修正 range function 的範圍 (Accepted)
3.5嘗試其他做法(Accepted)
3.6最精簡的作法(Accepted)
4.全部Code
5.小心得
Photo by ALEXANDRE DINAUT on Unsplash

寫在之前

前情提要

這一篇為學習到U7 project,在練習 LIOJ 平台上的 1008 幾個水桶這一題的解題過程,實作 Python code 和 Debug 的經過。

附上 LIOJ 連結: https://oj.lidemy.com/problem
題目1008 幾個水桶 連結: https://oj.lidemy.com/problem/1008

開始解題

題目理解

每個水桶的容量都是 2 的 n 次方,輸入為M 個單位的水,計算需要多少個水桶為輸出。

輸入輸出
輸入輸出範例

先寫第一個版本(Runtime Error)

出現錯誤 :Runtime Error,在 colab 上可以執行,但是在LIOJ 平台上是不同過的,所以開始debug,先是發現有可能是 tmp 變數未初始化,造成編譯錯誤,所以先來修正 tmp。

已修正 tmp 變數初始化(Time Limit Exceeded)

這時出現的錯誤為 Time Limit Exceeded,跑超過時間,有可能是 for 迴圈那邊的問題,所以這裡先把for 那邊都註解後,執行的結果就變成 Wrong answer,所以可以確定是迴圈的問題,那再仔細檢查一下輸入和輸出,發現輸入的範圍2的31 次方,但寫的時候 range設定為31 ,所以當輸入為2的31次方時,他會陷入迴圈無法跳出,因為:

  • range(31) 為 0、1、2…30
  • 所以應該改成 range(32)

可參考:

已修正 range function 的範圍 (Accepted)

成功 Accepted!!!之後嘗試一下其他的方法,原本是找尋2的次方大於water的i數值,現在改成以除法的方式做紀錄,也就是每一個都除以2,紀錄那個次方數。

嘗試其他做法(Accepted)

最精簡的作法(Accepted)

再回頭看題目時,會覺得他想測驗的就是"2進位"

換個方法想,若題目變形成 每個水桶的容量都是 4的 n 次方,那就是考"4進位"的概念。

因為原本的概念是一值除以一個水桶的單位,直到不能整除時,會產生出餘數,產生餘數時就成為一個桶子,那這樣的過程就是幾進位的想法。

全部Code

小心得

這題花了比較多的時間,但是覺得挺好玩的,慢慢懂題目設計的目的,繼續加油囉,努力寫出更精簡的code~~~

❤️感恩看到這裡的你,希望這篇文章有幫上你👏歡迎拍手給我鼓勵,我是甜不辣馬拉松,我們下次見

--

--

甜不辣馬拉松

幻想自己是貝多芬,可是敲打的卻是機械鍵盤