给你一个以二进制形式表示的数字 s
。请你返回按下述规则将其减少到 1 所需要的步骤数:
-
如果当前数字为偶数,则将其除以 2 。
-
如果当前数字为奇数,则将其加上 1 。
题目保证你总是可以按上述规则将测试用例变为 1 。
示例 1:
输入: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
示例 2:
输入:s = "10" 输出:1 解释:"10" 表示十进制数 2 。 Step 1) 2 是偶数,除 2 得到 1
示例 3:
输入:s = "1" 输出:0
提示:
1 <= s.length <= 500
s
由字符'0'
或'1'
组成。s[0] == '1'
方法一:模拟操作
模拟操作 1/2,同时用 carry 记录进位。
class Solution:
def numSteps(self, s: str) -> int:
carry = False
ans = 0
for c in s[:0:-1]:
if carry:
if c == '0':
c = '1'
carry = False
else:
c = '0'
if c == '1':
ans += 1
carry = True
ans += 1
if carry:
ans += 1
return ans
class Solution {
public int numSteps(String s) {
boolean carry = false;
int ans = 0;
for (int i = s.length() - 1; i > 0; --i) {
char c = s.charAt(i);
if (carry) {
if (c == '0') {
c = '1';
carry = false;
} else {
c = '0';
}
}
if (c == '1') {
++ans;
carry = true;
}
++ans;
}
if (carry) {
++ans;
}
return ans;
}
}
class Solution {
public:
int numSteps(string s) {
int ans = 0;
bool carry = false;
for (int i = s.size() - 1; i; --i) {
char c = s[i];
if (carry) {
if (c == '0') {
c = '1';
carry = false;
} else
c = '0';
}
if (c == '1') {
++ans;
carry = true;
}
++ans;
}
if (carry) ++ans;
return ans;
}
};
func numSteps(s string) int {
ans := 0
carry := false
for i := len(s) - 1; i > 0; i-- {
c := s[i]
if carry {
if c == '0' {
c = '1'
carry = false
} else {
c = '0'
}
}
if c == '1' {
ans++
carry = true
}
ans++
}
if carry {
ans++
}
return ans
}