题目如下:
/*
Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.
*/
如果是c语言,就是实现这样的一个函数:
char* addBinary(char* a, char* b) {
}
小白:还好我的英文是4.5级。就是有两个二进制数,求它们的和,并且也表示为二进制数了。很简单啊,把这两个数转成int,再相加,再转成二进制数就行啦!
陆小凤:这个做法解决不了数值大小溢出的问题,在字符串很长的情况下是不可行的。故不考虑这个方向。
小白:… 我就知道你会这么说的。
(1)一个不简洁的迭代办法
使用迭代的办法,逐位相加。
如何迭代?
一个while循环。从低位开始,每次取两个数字及进位相加(如果没有两个数字及进位,则迭代结束),记录本次相加的结果及新的进位值。字符串向高位移动,开始新的一轮迭代。
* 如何相加?
如果按两个数字跟进位的值来分情况判断,会繁琐一点。可以考虑都转化为int,再三者相加,对结果再分类(比如3时,说明新的进位值为1,并且本次相加的结果为1)。
* 如何向高位移动?
先取得两个字符串的最小长度为l,迭代时,每次取str[l_each_str-i-1],i=0 to (l-1),即可。
* 有哪些细节要注意?
在迭代结束后,还要看进位值是否为1。如果为1,则还需要再次迭代。每次拿剩下的数字,跟进位相加,在进位为0或没有剩余数字时结束。迭代结束后,判断进位的值,如果进位的值为1,则说明产生一个新的数字1。如果进位为0,则需要把剩余的数字直接作为返回的字符串的内容。
注意最终返回的字符串,在c语言中要以0结尾。
演示代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* addBinary(char* a, char* b) {
int more = 0;
int la = strlen(a);
int lb = strlen(b);
int lmin = la > lb ? lb : la;
int lmax = la > lb ? la : lb;
int retl = lmax + 1;
char* retstr = (char*)malloc(retl);
int i = 0;
while (i < lmin) {
char ca = a[la - i - 1];
char cb = b[lb - i - 1];
int ia = ((ca == '1') ? 1 : 0);
int ib = ((cb == '1') ? 1 : 0);
int temp = ia + ib + more;
if (temp == 3) {
retstr[retl - i - 1] = '1';
more = 1;
}
else if (temp == 2) {
retstr[retl - i - 1] = '0';
more = 1;
}
else if (temp == 1) {
retstr[retl - i - 1] = '1';
more = 0;
}
else {
retstr[retl - i - 1] = '0';
more = 0;
}
i ++;
}
char* left = ((la > lb) ? a : b);
if (more == 1) {
while (i < lmax && more) {
char c = left[lmax - i - 1];
int ic = (c == '1') ? 1 : 0;
int temp = ic + more;
if (temp == 2) {
retstr[retl - i - 1] = '0';
more = 1;
}
else if (temp == 1) {
retstr[retl - i - 1] = '1';
more = 0;
}
i ++;
}
}
if (more == 1) {
retstr[0] = '1';
char* rettemp = (char*)malloc(retl + 1);
memmove(rettemp, retstr, retl);
rettemp[retl] = 0;
free(retstr);
retstr = rettemp;
}
else {
if (i < lmax) {
while (i < lmax) {
char c = left[lmax - i - 1];
retstr[retl - i - 1] = c;
i ++;
}
}
memmove(retstr, retstr + 1, retl - 1);
retstr[retl - 1] = 0;
}
return retstr;
}
int main(int argc, char *argv[])
{
char a[] = "100";
char b[] = "110010";
char* ret = addBinary(a, b);
printf("ret = %s\n", ret);
free(ret);
return 0;
}
在leetcode上的运行时间:3ms。
(2)一个简洁的c++实现
#include <iostream>
#include <algorithm>
using namespace std;
class Solution {
public:
string addBinary(string a, string b) {
int c=0, i=a.size()-1, j=b.size()-1;
string ret;
while (c==1 || i>=0 || j>=0) {
c += i>=0 ? a[i--]-'0' : 0;
c += j>=0 ? b[j--]-'0' : 0;
ret += char(c&1) + '0';
c >>= 1;
}
reverse(ret.begin(), ret.end());
return ret;
}
};
int main(int argc, const char *argv[])
{
string a="100";
string b="110010";
Solution so;
string ret = so.addBinary(a, b);
cout << "ret=" << ret << endl;
return 0;
}
在leetcode上的运行时间:3ms。
https://mp.weixin.qq.com/s/FqM8h8T9tBPQ8-8sXoac9w