Problem Link

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" corresponds 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'

Solution


Python3

class Solution:
    def numSteps(self, s: str) -> int:
        N = len(s)
        res = 0
        carry = 0
 
        for i in range(N - 1, 0, -1):
            # odd number
            if int(s[i]) + carry == 1:
                carry = 1
                res += 2 # add 1 and divide by two
            else:
                res += 1
 
        return res + carry

C++

class Solution { // my own simulation 
public:
    int numSteps(string s) {        
        int ans = 0;
        while(s!="1"){
            const int n = s.size();
            if(s[n-1]=='0'){       // using right shift to simulate divide in binary          
               // s=s.substr(0,n-1); //ok
                s.pop_back(); // better
            }else{                 // binary addition
                int i = n - 1;
                for(; i>=0 && s[i]!='0'; i--) s[i]='0';
                if(i>= 0) s[i]='1';
                else 
                    s = '1'+s;
                    //s.insert(s.begin(), '1'); //ok
                    //s.insert(0, 1,'1'); //ok
            }
            ans++;
        }
        return ans;
    }
};