leetcode 67. 二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0

这个代码是抄网友的,觉得他写得好巧妙。

因为有可能出现进位,所以重新开辟内存len+1,而还要放"\0",所以len+2。注意的是因为数组是从0开始,结束符在数组的位置是len+1。

模拟加法部分:carry可以理解为进位,因为两个字符串只要还有数都要继续加,而如果两个字符串的数都加完有进位时,需要将进位(carry)的值加到最前面。

所以条件为(i >= 0 || j >= 0 || carry > 0)。

   而三目运算符需要将carry +=和(i >= 0) ? a[i--] - '0' : 0 分开看。先看右边如果条件i >= 0成立则运算a[i--] - '0',因为字符串里的是字符,通过运算后会变成整形值用于运算。所以他先把a和b同位的值相加放到carry中,通过carry % 2 + '0'; carry /= 2;语句实现如果没进位和有进位的情况。

最后:return res+k+1 ; //因为预留多一位用来最高位进位,若没有进位res[0]就没有值则不能直接返回res,而是返回第二个元素地址,修改为res+1,但有进位时又要返回首元素地址,则应该改为res+k+1

char * addBinary(char * a, char * b){
    int carry = 0;
    int lena = strlen(a);
    int lenb = strlen(b);
    int len  = fmax(lena, lenb);
    int i    = lena - 1;
    int j    = lenb - 1;
    char *res = (char*)malloc(sizeof(char) * (len + 2)); /* 长度可能是更长的字符串加1 */
    int k = len + 1;
    res[k--] = '\0'; /* 添加结束符 */

    /* 模拟加法处理 */
    while (i >= 0 || j >= 0 || carry > 0) {
        carry += (i >= 0) ? a[i--] - '0' : 0;
        carry += (j >= 0) ? b[j--] - '0' : 0;
        res[k--] = carry % 2 + '0';
        carry /= 2;
    }
    return res+k+1 ; //因为预留多一位用来最高位进位,若没有进位res[0]就没有值则不能直接返回res,而是返回第二个元素地址,修改为res+1,但有进位时又要返回首元素地址,则应该改为res+k+1
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅人字拖

老板大气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值