[力扣]5377. 将二进制表示减到 1 的步骤数

字符串加减

Posted by JinFei on April 1, 2020

题目描述

给你一个以二进制形式表示的数字 s 。请你返回按下述规则将其减少到 1 所需要的步骤数:

如果当前数字为偶数,则将其除以 2 。

如果当前数字为奇数,则将其加上 1 。

题目保证你总是可以按上述规则将测试用例变为 1 。

Example1:

  输入:s = "1101"
    输出:6
    解释:"1101" 表示十进制数 13 。
    Step 1) 13 是奇数,加 1 得到 14 
    Step 2) 14 是偶数,除 2 得到 7
    Step 3) 7  是奇数,加 1 得到 8
    Step 4) 8  是偶数,除 2 得到 4  
    Step 5) 4  是偶数,除 2 得到 2 
    Step 6) 2  是偶数,除 2 得到 1 

Example2:

  输入:s = "10"
    输出:1
    解释:"10" 表示十进制数 2 。
    Step 1) 2 是偶数,除 2 得到 1 

Example3:

  输入:s = "1"
    输出:0

提示

  • 1 <= s.length <= 500
  • s 由字符 ‘0’ 或 ‘1’ 组成。
  • s[0] == ‘1’

解题思路

  • 主要是字符串的加减
  • 如果是奇数,在后位加1
  • 如果是偶数,右移一位
  • 字符串增加,直接使用插入法,给一个位置和对应字符
class Solution {
public:
    int numSteps(string s) {
        long long step = 0;
        while(s.size() != 1){
            if(s[s.size() - 1] == '1'){
                s = fun_sum(s);
            }else{
                s = s.substr(0, s.size() - 1);
            }
            step++;
        }
        
        return step;
    }
    
    string fun_sum(string s){
        reverse(s.begin(), s.end());
        string res;
        int carry = 0;
        int pos = 0;
        while(pos < s.size()){
            if((pos == 0 && s[pos] - '0' + 1 == 2) || (s[pos] - '0' + carry == 2)){
                res.insert(res.begin() + pos, '0');
                carry = 1;
            }else{
                res.insert(res.begin() + pos, s[pos] + carry);
                carry = 0;
            }
            pos++;
        }
        if(carry == 1){
            res.insert(res.begin() + pos, '1');
        }
        reverse(res.begin(), res.end());
        return res;
    }

};