二进制求和

作者: Lularible | 来源:发表于2020-04-11 21:48 被阅读0次

    LeetCode第67题

    题目描述:

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

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

    示例 1:

    输入: a = "11", b = "1"
    输出: "100"
    示例 2:

    输入: a = "1010", b = "1011"
    输出: "10101"

    提示:

    每个字符串仅由字符 '0' 或 '1' 组成。
    1 <= a.length, b.length <= 10^4
    字符串如果不是 "0" ,就都不含前导零。

    思路

    用一个数组tmp将求和的结果存起来,再返回该数组。
    先分别求得较长和较短的字符串,赋值给char指针。对于两字符串等长的低位部分,从后往前遍历,取出其中的字符求和并加上进位,判断进位并保存在tmp对应位置。
    当较短的字符串遍历完,接着处理较长字符串的高位,同样采用加进位的方式,存到tmp对应位置。
    最后,如果最高位还有进位,就申请一个比tmp长度大1的数组result,在0的位置放‘1’,并把tmp中从前往后一次复制到result中。返回result。
    如果最高位没有进位,就无需申请数组了。返回tmp。
    注意,在数组末尾需要添上‘\0’,作为字符串结束标志。

    源代码

    char * addBinary(char * a, char * b){
        //创建数组,存储和
        //ASCII码:0是48,1是49
        int lenA = strlen(a);
        int lenB = strlen(b);
        int len = (lenA > lenB) ? lenA : lenB;
        char * tmp = (char *)malloc(sizeof(char) * (len + 1));
        char * longer = (lenA >= lenB) ? a : b;
        char * shorter = (lenA >= lenB) ? b : a;
        int carray = 0;     //保存进位
        int i,j;
        for(i = strlen(longer) - 1,j = strlen(shorter) - 1;j >= 0;--i,--j){
            tmp[i] = longer[i] + shorter[j] + carray;
            if(tmp[i] == 96){        
                tmp[i] = '0';
                carray = 0;
            }
            else if(tmp[i] == 97){   
                tmp[i] = '1';
                carray = 0;
            }
            else if(tmp[i] == 98){                      
                tmp[i] = '0';
                carray = 1;
            }
            else{
                tmp[i] = '1';
                carray = 1;
            }
        }
        for(j = i; j >=0;--j){
            tmp[j] = longer[j] + carray;
            if(tmp[j] == 50){
                tmp[j] = '0';
                carray = 1;
            }
            else{
                carray = 0;
            }
        }
        if(carray == 1){                //和的最高位还有进位
            char * result = malloc(sizeof(char) * (len + 2));
            result[0] = '1';
            for(i = 1;i <= len;++i){
                result[i] = tmp[i - 1];
            }
            result[i] = '\0';
            return result;
        }
    
        else{
            tmp[len] = '\0';
            return tmp;        
        }
    
    }
    

    分析

    时间复杂度和空间复杂度均为线性级别。
    注意,对于以char *形式定义的字符串中的字符,不能直接赋值。

    相关文章

      网友评论

        本文标题:二进制求和

        本文链接:https://www.haomeiwen.com/subject/fgppmhtx.html