leetcode 67 二进制求和
题目描述:
给你两个二进制字符串
a
和b
,以二进制字符串的形式返回它们的和。
解题思路分析:
那么,要想得到一个和,应该用一个新的数组,创建一个新的数组格式为:
int *p = (int *)malloc(sizeof(int) * num);char *p = (char *)malloc(sizeof(char) * num);
题目隐含条件:
用二进制字符串方式返回它们的和,意味着要使用char类型的数组
思路转化为代码:
1. 创建数组:char *p = (char *)malloc(sizeof(char) * num);
分析数组长度:假设l1为字符串1的长度,l2为字符串2的长度,max为l1,l2的最大值
则数组最大长度为max+1,由于会有'\\0',故数组长度为max+2;
char *p;p = (char*)malloc(sizeof(char) * max);
2. 对数组的某些值进行初始化:
p[0] = '0';p[max - 1] = '\\0';
3. 求和:
1 > 从末尾开始,就应该是a[i]中i从l1-1开始,b[j]中j从l2-1开始,p[k]中k从max-2开始 。
int i = -1, j = l2-1, k = max - 2;
2 > 会存在i=0或者j=0但是整个循环还没有结束的情况,就采用判断语句,可以采用三目运算符。
3 > 该题要输出字符串,但运算应使用整型,就利用ascll值进行运算,可知:int num1(a[i]的值) = a[i]-'0';
所以,得出以下代码:
while(i >= 0 || j >= 0)
{int num1 = i >= 0 ? a[i] - '0' : 0;int num2 = j >= 0 ? b[j] - '0' : 0;......
}
4 > 进行运算时,善用余数与除法,设flag为进位,sum为和,则
int sum = num1 + num2 + flag;p[k] = '0' + sum % 2;flag = sum / 2;
4. 对剩余一位进行处理:
if(flag != 0)
{p[k] = '1';
}
最后整理代码为:
int qiumax(int a, int b)
{if(a >= b){return a + 2;}else{return b + 2;}
}char * addBinary(char * a, char * b)
{int l1 = strlen(a);int l2 = strlen(b);int max = qiumax(l1, l2);int i = l1-1, j = l2-1, k = max - 2;int flag = 0;char *p;p = (char*)malloc(sizeof(char) * max);p[0] = '0';p[max - 1] = '\\0';while(i >= 0 || j >= 0){int num1 = i >= 0 ? a[i] - '0' : 0;int num2 = j >= 0 ? b[j] - '0' : 0;int sum = num1 + num2 + flag;p[k] = '0' + sum % 2;flag = sum / 2;i--, j--, k--;}if(flag != 0){p[k] = '1';}if(p[0] == '1'){return p;}else{return p + 1;}
}