题目如下:
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100".
分析如下:
按照从低位到高位的顺序逐个处理每个数字,分别看是0+0,还是0+1, 还是1+0,还是1+1,再看有没有前一次运算的进位。比较容易出bug的地方是,进位要记得更新。
我的代码:
//44ms
class Solution {
public:
string addBinary(string a, string b) {
int len_a=(int)a.size();
int len_b=(int)b.size();
if(len_a==0&&len_b==0)
return "0";
string added="0";
string res="";
len_a--;
len_b--;
while((len_a>=0)&&(len_b>=0)){
if(((a[len_a]-'0')==0)&&((b[len_b]-'0')==0)){ //bug1 字符串比较写错了,注意a[i]是char型的
if(added=="0")
res="0"+res;
else{
res="1"+res;
added="0"; //bug2 少写了这句话,更新进位变量added的取值
}
} else if( ( ( (a[len_a]-'0')==0) && ( (b[len_b]-'1')==0) ) || ( ( (a[len_a]-'1')==0)&&( (b[len_b]-'0')==0 ) ) ) {
if(added=="0"){
res="1"+res;
}else{
res="0"+res;
added="1";
}
}else{
if(added=="0"){
res="0"+res;
added="1";
} else {
res="1"+res;
added="1";
}
}
len_a--;
len_b--;
}
while(len_a>=0){
if(added=="0")
res=a[len_a]+res;
else{
if((a[len_a]-'0')==0){
res="1"+res;
added="0"; //bug3 少写了这句话,更新进位变量added的取值
}else{
res="0"+res;
added="1";
}
}
len_a--;
}
while(len_b>=0){
if(added=="0")
res=b[len_b]+res;
else{
if((b[len_b]-'0')==0){
res="1"+res;
added="0";
} else {
res="0"+res;
added="1";
}
}
len_b--;
}
if(added=="1")
res=added+res;
return res;
}
};
update: 2014-12-10
简化了代码。思路和Leetcoe 这道题目 Add Two Numbers一模一样.
class Solution {
public:
string addBinary(string a, string b) {
int index_a = a.length() - 1;
int index_b = b.length() - 1;
int rest = 0;
int current_int = 0;
char current_array[2];
string current_string = "";
string result = "";
while (index_a >= 0 && index_b >=0) {
current_int = (a[index_a] - '0' + b[index_b] - '0' + rest) % 2;
sprintf(current_array,"%d", current_int);
result = string(current_array) + result;
rest = (a[index_a] - '0' + b[index_b] - '0' + rest) / 2;
index_a--;
index_b--;
}
while (index_a >= 0) {
current_int = (a[index_a] - '0' + rest) % 2;
sprintf(current_array,"%d", current_int);
result = string(current_array) + result;
rest = (a[index_a] - '0' + rest) / 2;
index_a--;
}
while (index_b >= 0) {
current_int = (b[index_b] - '0' + rest) % 2;
sprintf(current_array,"%d", current_int);
result = string(current_array) + result;
rest = (b[index_b] - '0' + rest) / 2;
index_b--;
}
if (rest != 0){
sprintf(current_array,"%d", rest);
result = string(current_array) + result;
}
return result;
}
};