LeetCode 之 Add Binary — C 实现

Add Binary

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

给定两个二进制字符串,返回它们的和(仍是二进制字符串)。

例如,

a = "11"
b = "1"
Return "100".

分析:

首先检验二进制字符串的合法性,去点首尾的空格,是否有非法数字等(网上基本都没有检查,题目也没考虑),然后对应位相加。

注意进位,以及最高位是否有进位导致和的长度大于两个字符串长度。

char* addBinary(char* a, char* b) {
    char carry = 0; /*进位*/
    char *pa = a, *pb = b;
    char *paEnd = NULL, *pbEnd = NULL;
    char *pret = NULL; /*返回字符串*/
    int iretLen = 0;
    
    /*检验a字符串的合法性*/
    if(*a == ' ' || *a == '\t') 
    {
        while(*pa)
        {
            if(*pa == '0' || *pa == '1') /*找到第一个合法字符位置*/
            {
                a = pa;
                break;
            }
            else if(*pa != ' ' && *pa != '\t') /*开始既不为0也不为1,也不为空格,错误*/
            {
                return NULL;
            }
            ++pa;
        }
    }
    while(*pa && (*pa == '0' || *pa == '1'))/*找到中间合法字符串*/
    {
        ++pa;
    }
    if(!*pa)/*后面字符串都合法*/
    {
        paEnd = --pa;
    }
    else
    {
        while(*pa)
        {
            if(*pa != ' ' && *pa != '\t') /*字符串末尾含有非法字符*/
                return NULL;
            ++pa;
        }
    }
    
    /*检验b字符串的合法性*/
    if(*b == ' ' || *b == '\t')
    {
        while(*pb)
        {
            if(*pb == '0' || *pb == '1') /*找到第一个合法字符位置*/
            {
                b = pb;
                break;
            }
            else if(*pb != ' ' && *pb != '\t') /*开始既不为0也不为1,也不为空格,错误*/
            {
                return NULL;
            }
            ++pb;
        }
    }
    while(*pb && (*pb == '0' || *pb == '1')) /*找到中间合法字符串*/
    {
        ++pb;
    }
    if(!*pb) /*后面字符串都合法*/
    {
        pbEnd = --pb;
    }
    else
    {
        while(*pb)
        {
            if(*pb != ' ' && *pb != '\t') /*字符串末尾含有非法字符*/
                return NULL;
            ++pb;
        }
    }
    
    /*计算二进制相加*/
    iretLen = (((pbEnd-b)>(paEnd-a))?(pbEnd-b+1):(paEnd-a+1)) + 2;/*预留最高位进位和结尾符*/
    pret = (char *)malloc(iretLen);
    pret[--iretLen] = '\0';
    --iretLen;
    while(paEnd >= a || pbEnd >= b)
    {
        if(paEnd < a)
        {
            pret[iretLen--] = (*pbEnd - '0' + carry)%2 + '0';
            carry = (*pbEnd - '0' + carry)/2;
            --pbEnd;
            continue;
        }
        if(pbEnd < b)
        {
            pret[iretLen--] = (*paEnd - '0' + carry)%2 + '0';
            carry = (*paEnd - '0' + carry)/2;
            --paEnd; 
            continue;
        }
 
        pret[iretLen--] = (*paEnd - '0' + *pbEnd - '0' + carry)%2 + '0';
        carry = (*paEnd - '0' + *pbEnd - '0' + carry)/2;
        --paEnd;
        --pbEnd;
    }
    pret[0] = carry + '0';
    if(pret[0] == '0')
    {
        pa = pret;
        while(*pa)
        {
            *pa = *(pa + 1);
            ++pa;
        }
    }
    
    return pret;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值