LeetCode 1342. Number of Steps to Reduce a Number to Zero

Question

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.

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.

Solution

It’s kind like of this question: 397. Integer Replacement, but it’s eaiser. Because we don’t have to make the choice to get the minimum and we just need to do different operations in different situations.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// time: 
// worse: O(n) best: O(logn)
// space:O(n)
public int numberOfSteps (int num) {
if (num == 0) return 0;
if (num % 2 == 0) return 1 + numberOfSteps(num / 2);
else return 1 + numberOfSteps(num - 1);
}

// space:O(1)
public int numberOfSteps (int num) {
if (num == 0) return 0;
int res = 0;
while (num > 0) {
if (num % 2 == 0) num /= 2;
else num -= 1;
res++;
}
return res;
}