67. 二进制求和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuchonghao/article/details/79979182

一、题意
给定两个二进制字符串,返回他们的和(用二进制表示)。

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

示例 1:

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

输入: a = “1010”, b = “1011”
输出: “10101”

二、分析和解答

 public String addBinary(String a, String b) {
        char[] aa = a.toCharArray();
        char[] bb = b.toCharArray();
        int len = (a.length() >= b.length()) ? a.length() + 1 : b.length() + 1;
        int[] res = new int[len];
        int i=aa.length-1,j=bb.length-1;
        int index = len - 1;

        int m,n,val = 0;
        while(i>=0 || j>=0 || val > 0){
            m = (i < 0) ? 0 : aa[i] - '0';
            n = (j < 0) ? 0 : bb[j] - '0';
            res[index--] = (m + n + val) % 2;
            val = (m + n + val) / 2;

            i--;
            j--;
        }
        String str = "";
        for(int t=0;t<len;t++){
            str += res[t];
        }
        if('0' == str.charAt(0)){
            return str.substring(1,str.length());
        }else
            return str;
    }

我的错点:
(1)要考虑到二进制加法和十进制的加法是同理的,都可以使用取余和除法来处理!但是进位要使用除法,该位置的值要使用取余!我开始没注意到这一点,直接列出了各种情况;
(2)要考虑进位的要求,当进位是1时,哪怕 i 或者 j 都小于0时,也是要计算的!重点:最后一位 的进位!
(3)三目运算符。有一点是很重要:当i < 0时,假设这一位为0,不影响计算;
(4)char和int类型的转换不能直接进行强转!最简单的方法是字符减去‘0’ 。
之前做过一个链表求和的问题,那个不是字符串,原理相同。
(5)也可以考虑设置result为一个空串,代码:

 public String addBinary(String a, String b) {
        char[] aa = a.toCharArray();
        char[] bb = b.toCharArray();

        int i=aa.length-1,j=bb.length-1;

        String str = "";
        int m,n,val = 0;
        while(i>=0 || j>=0 || val > 0){
            m = (i < 0) ? 0 : aa[i] - '0';
            n = (j < 0) ? 0 : bb[j] - '0';

            str = (m + n + val) % 2 + str;
            val = (m + n + val) / 2;

            i--;
            j--;
        }

        if('0' == str.charAt(0) && str.length() > 1){
            return str.substring(1,str.length());
        }else
            return str;
    }
阅读更多

没有更多推荐了,返回首页