67. 二进制求和 - 力扣(LeetCode)
又是一道求和题,% / 在求和的用途了解了些,
目录
题目:
思路分析:
博主代码:
官方代码:
每日表情包:
题目:
思路分析:
求和,就对齐单个字符式的求和以及转换成整型求和,当然转换成整型有溢出的烦恼。
遍历即可,不过得注意自己malloc的字符串要记得加上一个字符串的结束标志'\0'
既然是遍历就是时O(n)又因为是自己malloc返回,所以空O(n),
博主代码:
char AddCheck01(char ch1, char ch2, char flag)
{
if (((ch1 + ch2 + flag) - 3 * '0') >= 2) return '1';
else return '0';
}
char* addBinary(char* a, char* b) {
//要想相加,对齐末位很有必要,所以先求长度
//官解的reserve是变相的对齐相加
int sizeA = strlen(a);
int sizeB = strlen(b);
char flag = '0';
int size = (sizeA > sizeB ? sizeA : sizeB);
char* Return = (char*)malloc(sizeof(char) * (size + 1));
Return[size] = '\0';//很容易忘记的字符串要带的结束标志
for (int i = 1; i <= size; ++i) {
char Acur = (sizeA - i) >= 0 ? a[sizeA - i] : '0';
char Bcur = (sizeB - i) >= 0 ? b[sizeB - i] : '0';
Return[size - i] = Acur ^ Bcur ^ flag;
flag = AddCheck01(Acur, Bcur, flag);
//%,/,的相加看起来要好多了(之前的十进制链表的题用过)
}
if (flag == '1') {//可能的进一位情况
char* tmp = (char*)malloc(sizeof(char) * (size + 2));
memmove((tmp + 1), Return, sizeof(char) * (size + 1));
tmp[0] = '1';
free(Return);
Return = tmp;
}
return Return;
}
官方代码:
不喜欢这种malloc方式,在不进一位的情况下,相当于多开辟了空间,
void reserve(char* s) {
int len = strlen(s);
for (int i = 0; i < len / 2; i++) {
char t = s[i];
s[i] = s[len - i - 1], s[len - i - 1] = t;
}
}
char* addBinary(char* a, char* b) {
reserve(a);
reserve(b);
int len_a = strlen(a), len_b = strlen(b);
int n = fmax(len_a, len_b), carry = 0, len = 0;
char* ans = (char*)malloc(sizeof(char) * (n + 2));
for (int i = 0; i < n; ++i) {
carry += i < len_a ? (a[i] == '1') : 0;
carry += i < len_b ? (b[i] == '1') : 0;
ans[len++] = carry % 2 + '0';
carry /= 2;
}
if (carry) {
ans[len++] = '1';
}
ans[len] = '\0';
reserve(ans);
return ans;
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/add-binary/solutions/299667/er-jin-zhi-qiu-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。