给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
解题关键:解决各位进位判断,本人做法是先不考虑进位,短数组加到长数组上,再根据长数组依次判断进位。
char* addBinary(char* a, char* b) {
int length1=0,length2=0,flag=0;
char *p1=NULL,*p2=NULL,*p3=NULL;
length1 = strlen(a) > strlen(b)? strlen(a):strlen(b); //length1保存长数组长度
length2 = strlen(a) > strlen(b)? strlen(b):strlen(a); //length2保存短数组长度
p1 = strlen(a)>strlen(b)? a:b; //p1保存长数组地址
p2 = strlen(a)>strlen(b)? b:a; //p2保存短数组地址
for(int i = length1-1,j = length2-1;i>=0&&j>=0;i--,j--){
p1[i]+=p2[j]-48; //先将短数组加到长数组,因为字符与字符相加
} //减去ASCII码值,‘0’=48.
for(int i = length1-1;i>0;i--){ //除了第一位之外依次进位
if(flag==1) {
p1[i]++;
flag = 0;
}
if((p1[i]-48)>=2){
flag = 1;
p1[i]-=2;
}
}
if(flag == 1){ //计算第一位当前值
p1[0]++;
}
if(p1[0]<=49) return p1; //判断第一位是否要进位,若不进位直接返回
else{ //若要进位重开数组,首位置1,
p1[0]-=2; //其余用p1覆盖。
p3 = (char *)malloc(length1+2);
p3[0] = '1';
for(int i = 0;i < length1;i++){
p3[i+1] = p1[i];
}
p3[length1+1] = '\0';
return p3;
}
}//8ms 时间复杂度O(n) 空间复杂度O(1)或O(n)