本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。
問題描述
給你一個非負整數 num ,請你返回將它變成 0 所需要的步數。如果當前數字是偶數,你需要把它除以 2 ;否則,減去 1 。
爲了方便理解題意,下面給出兩個示例:
示例 1:
輸入:num = 14
輸出:6
解釋:
步驟 1) 14 是偶數,除以 2 得到 7 。
步驟 2) 7 是奇數,減 1 得到 6 。
步驟 3) 6 是偶數,除以 2 得到 3 。
步驟 4) 3 是奇數,減 1 得到 2 。
步驟 5) 2 是偶數,除以 2 得到 1 。
步驟 6) 1 是奇數,減 1 得到 0 。
示例 2:
輸入:num = 8
輸出:4
解釋:
步驟 1) 8 是偶數,除以 2 得到 4 。
步驟 2) 4 是偶數,除以 2 得到 2 。
步驟 3) 2 是偶數,除以 2 得到 1 。
步驟 4) 1 是奇數,減 1 得到 0 。
(來源:力扣)
解決方案
首先,由題意可知:題目要求給出一個非負整數num,返回將它變成零所需要的次數,並要求當數爲偶數時,需要將其除以2,爲奇數時,將其減去1。如此重複操作,直到將其變爲0,最後返回操作的次數。
然後,我們再來找出裏面的關鍵點:首先是num是一個非負整數,所以我們代碼不需要對數的類型進行判斷,其次是當這個數足夠大的時候肯定會經過許多次減去1或者是除以2的操作,那麼肯定會用到循環。我們再進一步思考,常用的循環主要有for循環和while循環,那麼針對本道題目,選取哪一種循環更好呢?於是我們再進一步思考,for循環一般用於在知道循環次數的情況下,在目標循環次數內進行操作,而while循環一般用於不知道循環次數情況下,在條件範圍內循環,滿足條件後直接退出循環。可見,對比兩種循環後,針對本道題目,選擇while循環更合適。
最後,在確定循環後,不要着急寫代碼,題目中還有要求,當該數變成偶數時,需要除以2,爲奇數時,需要減去1。所以,在while循環中,我們還需要加入判斷語句。這樣才能在題目要求範圍內完成題目。
也許大家現在有一個疑問,for循環是在知道循環次數的情況下進行操作,進而很容易統計循環次數,但while循環是滿足條件就跳出循環,要怎樣統計循環次數呢?這個問題其實很簡單,我們只需要在循環外定義一個初始值爲0的變量,然後每循環一次就加1,這樣在循環完成後,循環次數也就統計出來啦!
下面請看題解代碼:
def math(): num = int(input('')) a = 0 while num != 0: if num % 2 == 0: num = num / 2 a = a + 1 elif num % 2 != 0: num = num - 1 a = a + 1 return a print(math()) |
測試結果:
上述代碼適合於大多數朋友的思路,本人也在其他地方找到了其他的思路,現在將代碼分享給大家共勉:
class Solution: def numberOfSteps (self, num: int) -> int: return bin(num).count('1') + num.bit_length() - 1 |
(來源:力扣)
當然本題的解法遠不止以上兩種,還有許多不同的解法,大家也可以多多思考,歡迎和筆者一起探討。
結語
綜上所述,對於一道題目,我們不能急於去寫代碼,而是要充分分析題目當中所蘊含的內容,認真思考,在寫代碼前要將整體思路分析清晰,甚至可以廣角度地思考,因爲同一道題大多數會有許多不同的解法,我們可以多多嘗試不同的解法,拓展自己的思路,而不是常用一種方法或是一種思路,那樣的話,久而久之就會限制自己的思維,形成思維定勢,對自己思維的提高具有很大的侷限性。
實習編輯:李欣容
作者:黃曰標+吳合力+齊華軍
稿件來源:深度學習與文旅應用實驗室(DLETA)
本文分享自微信公衆號 - 算法與編程之美(algo_coding)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。