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;
}
};
執行效率為:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN3QDM5UjMhZWZ1QmZjdTNzYzXxIDMwAjM1IzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
執行效率為雙百!
題解二: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;
}
}