LeetCode:67.二进制求和

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

每日表情包:

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值