[LeetCode February Challange] Day 12 - Number of Steps to Reduce a Number to Zero
Given a non-negative integer num, return the number of steps to reduce it to zero. If the current number is even, you have to divide it by 2, otherwise, you have to subtract 1 from it.
Example 1:
Input: num = 14
Output: 6
Explanation:
Step 1) 14 is even; divide by 2 and obtain 7.
Step 2) 7 is odd; subtract 1 and obtain 6.
Step 3) 6 is even; divide by 2 and obtain 3.
Step 4) 3 is odd; subtract 1 and obtain 2.
Step 5) 2 is even; divide by 2 and obtain 1.
Step 6) 1 is odd; subtract 1 and obtain 0.
Example 2:
Input: num = 8
Output: 4
Explanation:
Step 1) 8 is even; divide by 2 and obtain 4.
Step 2) 4 is even; divide by 2 and obtain 2.
Step 3) 2 is even; divide by 2 and obtain 1.
Step 4) 1 is odd; subtract 1 and obtain 0.
Example 3:
Input: num = 123
Output: 12
Constraints:
- 0 <= num <= 10^6
Solution
Simulation
Time complexity : O(nlong)
Space complexity : O(1)
class Solution {
public:
int numberOfSteps (int num) {
int ans = 0;
while (0 < num) {
++ans;
num = num % 2 ? num-1 : num / 2;
}
return ans;
}
};
Bit Manipulation
Time complexity : O(nlong)
Space complexity : O(1)
class Solution {
public:
int numberOfSteps (int num) {
string b_str = "";
while (0 < num) {
b_str = to_string(num%2) + b_str;
num /= 2;
}
printf("%s", b_str.c_str());
int ans = 0;
for (char c: b_str) {
if (c == '1') ans += 2;
else ans += 1;
}
return max(0, ans-1);
}
};
將一 int 轉為 binary string,一一將位元消掉。
若最小位元為 “1”,則需要「減1」、「右移(除2)」,需 2 步。
若最小位元為 “0”, 則需要「右移(除2)」,需 1 步。
最後的答案需少一步的原因是:最後一個 “1” 只需要1步就到 0,而非 2 步。