Skip to content

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

Difficulty Topics

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'

Solution

number-of-steps-to-reduce-a-number-in-binary-representation-to-one.py
class Solution:
    def numSteps(self, s: str) -> int:
        n = int(s,2)
        res = 0
        while n > 1:
            if n & 1:
                n = -(~n)
            else:
                n >>= 1

            res += 1

        return res
number-of-steps-to-reduce-a-number-in-binary-representation-to-one.cpp
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;
    }
};