题目描述
给你一个以二进制形式表示的数字 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;
}
};