算法創作 | 將數字變成 0 的操作次數

本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。


問題描述

給你一個非負整數 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源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章