Number of Steps to Reduce a Number in Binary Representation to One

medium bit manipulation binary carry greedy

Problem

Given the binary representation of an integer as a string s, return the number of steps to reduce it to 1 under these rules: if the current number is even you must divide it by 2; if it is odd you must add 1 to it. It is guaranteed that 1 is always reachable.

Inputs = "1101"
Output6
13 → 14 → 7 → 8 → 4 → 2 → 1 takes 6 steps (add, halve, add, halve, halve, halve).
Inputs = "10"
Output1
2 is even, divide by 2 to reach 1 in a single step.

def num_steps(s):
    steps, carry = 0, 0
    for i in range(len(s) - 1, 0, -1):
        bit = int(s[i]) + carry
        if bit == 1:            # odd: add 1, then divide
            steps += 2
            carry = 1
        else:                   # even: just divide
            steps += 1
            carry = bit // 2
    return steps + carry        # absorb leading bit + carry
function numSteps(s) {
  let steps = 0, carry = 0;
  for (let i = s.length - 1; i > 0; i--) {
    const bit = (s[i] - 0) + carry;
    if (bit === 1) {          // odd: add 1, then divide
      steps += 2;
      carry = 1;
    } else {                  // even: just divide
      steps += 1;
      carry = bit >> 1;
    }
  }
  return steps + carry;       // absorb leading bit + carry
}
int numSteps(String s) {
    int steps = 0, carry = 0;
    for (int i = s.length() - 1; i > 0; i--) {
        int bit = (s.charAt(i) - '0') + carry;
        if (bit == 1) {        // odd: add 1, then divide
            steps += 2;
            carry = 1;
        } else {               // even: just divide
            steps += 1;
            carry = bit >> 1;
        }
    }
    return steps + carry;      // absorb leading bit + carry
}
int numSteps(string s) {
    int steps = 0, carry = 0;
    for (int i = (int)s.size() - 1; i > 0; i--) {
        int bit = (s[i] - '0') + carry;
        if (bit == 1) {        // odd: add 1, then divide
            steps += 2;
            carry = 1;
        } else {               // even: just divide
            steps += 1;
            carry = bit >> 1;
        }
    }
    return steps + carry;      // absorb leading bit + carry
}
Time: O(n) Space: O(1)