1404. Number of Steps to Reduce a Number in Binary Representation to One
Description
Given the binary representation of an integer as a string s
, return the number of steps to reduce it to 1
under the following rules:
If the current number is even, you have to divide it by
2
.If the current number is odd, you have to add
1
to it.
It is guaranteed that you can always reach one for all test cases.
Example 1:
Input: s = "1101" Output: 6 Explanation: "1101" corressponds to number 13 in their decimal representation. Step 1) 13 is odd, add 1 and obtain 14. Step 2) 14 is even, divide by 2 and obtain 7. Step 3) 7 is odd, add 1 and obtain 8. Step 4) 8 is even, divide by 2 and obtain 4. Step 5) 4 is even, divide by 2 and obtain 2. Step 6) 2 is even, divide by 2 and obtain 1.
Example 2:
Input: s = "10" Output: 1 Explanation: "10" corressponds to number 2 in their decimal representation. Step 1) 2 is even, divide by 2 and obtain 1.
Example 3:
Input: s = "1" Output: 0
Constraints:
1 <= s.length <= 500
s
consists of characters '0' or '1's[0] == '1'
Solutions
Solution: Bit Manipulation
- Time complexity: O(n - 1)
- Space complexity: O(1)
- carry = 0 and current = 0, number is even, have to divide it by 2, step + 1
- carry = 0 and current = 1, number is odd, have to add 1 and divide it by 2, step + 2
- carry = 1 and current = 1, number is even, divide it by 2, step + 1
- carry = 1 and current = 0, number is odd, have to add 1 and divide it by 2, step + 2
JavaScript
js
/**
* @param {string} s
* @return {number}
*/
const numSteps = function (s) {
let step = (carry = 0);
for (let index = s.length - 1; index > 0; index--) {
const value = s[index];
if (value === '0') {
step += carry ? 2 : 1;
continue;
}
step += carry ? 1 : 2;
carry = 1;
}
return step + carry;
};