67. 二进制求和(Java)

2019-08-16  本文已影响0人  软萌白甜Hedy

题目

给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"

解题过程:

我将每一步的思路都注释在代码上,所以不做其他解释:

 public String addBinaryOwn(String a, String b){
//        1.先保证两个字符串不为空;
        if(a==null||a.length()==0){
            return b;
        }
        if(b==null||b.length()==0){
            return a;
        }
//        2.在两个字符串不为空的前提下,像十进制加法一样,从个位开始,也就是二进制的从低位到高位的顺序,
//        设置两个字符串的最低位标记索引;
        int i = a.length()-1;
        int j = b.length()-1;

//        3.设置进位为0;
        int c =0;
//        4.用一个stringbuilder来放计算当前位置和结果的字符串;
        StringBuilder res = new StringBuilder();
        //5.从最低位开始循环,因为ab的长度可能不一致,必须有索引不能为负数的前提,还要考虑到最高位只剩一个进位的情况;
        while(i>=0||j>=0||c==1){
            if(i>=0){
                //6.进位跟a当前位置的字符相加;
                c+= a.charAt(i)-'0';
            }
           if(j>=0){
               //7.进位跟b当前位置的字符相加;
               c+= b.charAt(j)-'0';
           }
            //8.此时c可能的情况有三种:0(不进位,当前位置和为0),1(不进位,当前位置和为1),2(进位1,当前位置和为0),
            // 3(进位1,当前位置和为1);
            //9.以此看来,当前位置的和可以看成add/2的余数,进位是add右移一位之后的值;
            res.append(c%2);
            c>>=1;
            //10.ab的索引各-1,向左挪一位。
            i--;
            j--;
        }
        return res.reverse().toString();
}

结果

执行用时 :5 ms, 在所有 Java 提交中击败了80.25%的用户
内存消耗 :36.1 MB, 在所有 Java 提交中击败了55.25%的用户

上一篇 下一篇

猜你喜欢

热点阅读