天天看點

LeetCode 1342. 将數字變成 0 的操作次數 雙百效率 多種題解 C/C++/Java/Python

LeetCode 1342. 将數字變成 0 的操作次數 雙百效率 多種題解 C/C++/Java/Python

  大家好,我叫亓官劼(qí guān jié )

題目

難度 簡單

給你一個非負整數 ​

​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 。      

示例 3:

輸入:num = 123
輸出:12      

提示:

  • ​0 <= num <= 10^6​

題解一:C/C++解法

  給我們一個數,讓我們求将這個數變為一需要的次數。變化的規則為:​

​如果目前數字是偶數,你需要把它除以 2 ;否則,減去 1 。​

​​則我們隻需要一個while直至他為0,然後求傳回次數即可。(這裡判斷奇偶數可以使用​

​&​

​​與算法來,會比求模運算快,在另一篇文章中寫到過,如果有興趣的話可以去看看,文章位址為:​​為什麼同樣的算法,你的程式卻一直逾時? 算法競賽你不得不知道的小技巧​​)

完整的題解代碼為:

class Solution {
public:
    int numberOfSteps (int num) {
        int ans = 0;
        while(num){
            ans++;
            if(num&1)
                num--;
            else
                num /= 2;
        }
        return ans;
    }
};      

執行效率為:

LeetCode 1342. 将數字變成 0 的操作次數 雙百效率 多種題解 C/C++/Java/Python

執行效率為雙百!

題解二:Python解法

  給我們一個數,讓我們求将這個數變為一需要的次數。變化的規則為:​

​如果目前數字是偶數,你需要把它除以 2 ;否則,減去 1 。​

​​則我們隻需要一個while直至他為0,然後求傳回次數即可。(這裡判斷奇偶數可以使用​

​&​

​​與算法來,會比求模運算快,在另一篇文章中寫到過,如果有興趣的話可以去看看,文章位址為:​​為什麼同樣的算法,你的程式卻一直逾時? 算法競賽你不得不知道的小技巧​​)

完整的題解代碼為:

class Solution:
    def numberOfSteps (self, num: int) -> int:
        ans = 0
        while(num):
            ans = ans + 1
            if(num&1):
                num = num - 1
            else:
                num = int(num / 2)
        return      

題解三:Java解法

class Solution {
    public int numberOfSteps (int num) {
        int ans = 0;
        while(num > 0){
            ans++;
            if(num%2 == 1)
                num--;
            else
                num /= 2;
        }
        return ans;
    }
}