【题目描述】
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
【测试用例】
示例1:
输入:a = "11",b = "1"
输出:"100"
示例2:
输入:a = "1010",b = "1011"
输出:"10101"
【思路分析】
最开始我想的是两个字符串从后往前遍历,对应位置相加,模拟正常的二进制加法计算,有进位的将进位1保存在jinWei变量中,无进位的正常相加。但是这样的做法在代码逻辑上有点复杂,因为相加的结果要存入结果字符串res的对应位置,这个索引不好控制(涉及到相加后会比原来的最长字符串的长度多一位的情况)。
所以为了便于理解,最开始就直接将两个字符串逆置,然后从前往后遍历,对应位相加,同时存储到res中的位置也相同,这样就可以用一个遍历i来表示所有的位置,最后再将res逆置回来。
【参考代码】
C实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>//easy-67-二进制求和
void reverse(char* s);
char* addBinary(char* a, char* b);int main(){char* a = "11";char* b = "1";char* res = addBinary(a, b);int i;for(i=0;i<strlen(res);++i){printf("%c",res[i]); }return 0;
} void reverse(char* s){int i;int len = strlen(s);for(i=0;i<len/2;++i){char tmp = s[i];s[i] = s[len-i-1];s[len-i-1] = tmp;}
} char* addBinary(char* a, char* b) {reverse(a);reverse(b);int i;int jinWei=0;int len1 = strlen(a);int len2 = strlen(b);int len = len1>len2 ? len1 : len2;char* res = (char*)malloc(sizeof(char)*(len+2));for(i=0;i<len;++i){if(i<len1 && i<len2){int tmp = (a[i]-'0') + (b[i]-'0') + jinWei;res[i] = (tmp % 2) + '0';jinWei = tmp / 2;}else if(i<len1 && i>=len2){int tmp = (a[i]-'0') + jinWei;res[i] = (tmp % 2) + '0';jinWei = tmp / 2;}else if(i>=len1 && i<len2){int tmp = (b[i]-'0') + jinWei;res[i] = (tmp % 2) + '0';jinWei = tmp / 2;}}if(jinWei){res[len++]='1';}res[len] = '\0';reverse(res);return res;
}
C++实现
#include <iostream>
#include <string>
using namespace std;//easy-67-二进制求和
class Solution {
public:string reverse(string s);string addBinary(string a, string b);
};string Solution::reverse(string s){int i;int len = s.size();for(i=0;i<len/2;i++){char tmp = s[i];s[i] = s[len-i-1];s[len-i-1] = tmp;}return s;
}string Solution::addBinary(string a, string b){a = reverse(a);b = reverse(b);int i;int len1 = a.size();int len2 = b.size();int len = len1>len2 ? len1 : len2;int jinWei = 0;string res;for(i=0;i<len;i++){if(i<len1 && i<len2){int tmp = (a[i]-'0') + (b[i]-'0') + jinWei;res += (tmp % 2) + '0';jinWei = tmp / 2;}else if(i<len1 && i>=len2){int tmp = (a[i]-'0') + jinWei;res += (tmp % 2) + '0';jinWei = tmp / 2;}else if(i>=len1 && i<len2){int tmp = (b[i]-'0') + jinWei;res += (tmp % 2) + '0';jinWei = tmp / 2;}}if(jinWei){res += '1';}res = reverse(res);return res;
}int main(){string a = "0";string b = "0";Solution sol;string res = sol.addBinary(a, b);int i;for(i=0;i<res.size();++i){cout<<res[i];}return 0;
}