目錄
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.小心得
寫在之前
- 完整課程傳送門
- 系列文:[Lidemy 學習筆記]-先別急著寫 leetcode Unit0
- 系列文:[Lidemy 學習筆記]-先別急著寫 leetcode Unit1//教練,我想要寫Code
- 系列文:[Lidemy 學習筆記]-先別急著寫 leetcode Project1//實作:字串反轉、陣列總和、找最大值
- 系列文:[Lidemy 學習筆記]-先別急著寫 leetcode Project2//實作:找陣列次小值、大小寫互換、印出因數
- 系列文:[Lidemy 學習筆記]-先別急著寫 leetcode Project3//實作:靈魂伴侶、音速小子、貪婪的小偷
- [Lidemy 學習筆記]-先別急著寫 leetcode U4//實作:判斷質數、好多星星、印出金字塔、印出聖誕樹、NM乘法表、水仙花數
- [Lidemy 學習筆記]-先別急著寫 leetcode U5//實作:經典題目
- [Lidemy 學習筆記]-先別急著寫 leetcode U6//實作:內建函式
前情提要
這一篇為學習到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~~~
❤️感恩看到這裡的你,希望這篇文章有幫上你👏歡迎拍手給我鼓勵,我是甜不辣馬拉松,我們下次見