给你一个以二进制形式表示的数字 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’
错误示范
未读清题目要求,s.length<=500,远远超过int64的长度,导致溢出
#include <iostream>
#include <string>
using namespace std;
// 该方法解决问题,若str过长,肯定会溢出,故方法不可取
int strToDec(string str) {
int base = 2;
int res = 0;
for(int i = 0; i < str.size(); i++) {
int tmp = str[i] - '0';
res *= base;
res += tmp;
}
return res;
}
int numSteps(string s) {
if(s.empty()) {
return -1;
}
int num = strToDec(s);
int step = 0;
while (num != 1) {
if (num % 2 == 1) { // 奇数
num = num + 1;
} else if (num % 2 ==0) { // 偶数
num = num / 2;
} else {
return -1;
}
step++;
}
return step;
}
int main() {
string str = "1101";
int res = numSteps(str);
cout << res << endl;
}
模拟二进制加1
#include <iostream>
#include <string>
using namespace std;
string addOne(string str) {
int flag = 1;
for (int i = str.size() - 1; i >= 0; i--) {
if(str[i] == '1' && flag == 1) {
flag = 1;
str[i] = '0';
if (i == 0) {
str.insert(0, "1");
}
} else if (str[i] == '0' && flag == 1) {
str[i] = '1';
flag = 0;
break;
} else if (str[i] == '1' && flag == 0) {
str[i] == '1';
flag = 0;
break;
} else if (str[i] == '0' && flag == 0) {
str[i] = '0';
flag = 0;
break;
}
}
return str;
}
bool isOdd(string str) {
if (str[str.size() - 1] == '1') {
return false;
} else if (str[str.size() - 1] == '0') {
return true;
} else {
return false; // error
}
}
int numSteps(string s) {
if (s.empty()) {
return -1;
}
int step = 0;
while (s.size() > 1) {
if (isOdd(s)) {
s.pop_back();
} else {
s = addOne(s);
}
step++;
}
return step;
}
int main() {
string str = "10";
int res = numSteps(str);
cout << res << endl;
}
删除冗余代码
#include <iostream>
#include <string>
using namespace std;
string addOne(string str) {
int flag = 1;
for (int i = str.size() - 1; i >= 0; i--) {
if(str[i] == '1' && flag == 1) {
flag = 1;
str[i] = '0';
if (i == 0) {
str.insert(0, "1");
}
} else if (str[i] == '0' && flag == 1) {
str[i] = '1';
break;
} else {
break;
}
}
return str;
}
bool isOdd(string str) {
if (str[str.size() - 1] == '1') {
return false;
} else if (str[str.size() - 1] == '0') {
return true;
} else {
return false; // error
}
}
int numSteps(string s) {
if (s.empty()) {
return -1;
}
int step = 0;
while (s.size() > 1) {
if (isOdd(s)) {
s.pop_back();
} else {
s = addOne(s);
}
step++;
}
return step;
}
int main() {
string str = "1011";
int res = numSteps(str);
cout << res << endl;
}