Leetcode-字符串-67

67. Add Binary

题目链接

Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.

Input: a = “11”, b = “1”
Output: “100”

两个二进制数求和,返回结果的二进制字符串表示。

方法1:2ms

二进制相加进位=(各位相加+前一位的进位)% 2 , 各位值=(各位相加+前一位的进位)/ 2
两个字符串长度不相等时,相加无需额外补零。
在循环中,从字符串尾部开始读,标志位不断减一。循环条件将两个标志位 i>=0、j>=0 的条件在一起,是为了保证若一个字符串读完,另一个字符串还没读完时不停止循环,还可继续按各位相加,只不过已读完的那个字符串中被加位的是0。

条件运算符(?:) variable x = (expression) ? value if true : value if false
三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
如:b = (a == 1) ? 20 : 30

前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算
后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算
int b = ++a; 拆分运算过程为: a=a+1=4; b=a=4, 最后结果为b=4,a=4
int d = –c; 拆分运算过程为: c=c-1=2; d=c=2, 最后结果为d=2,c=2

public String addBinary3(String a, String b) {
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;  //进位
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0 || carry > 0){
            int sum = 0;   //每位的加和,包括进位
            sum += (i >= 0) ? a.charAt(i--) - '0' : 0;
            sum += (j >= 0) ? b.charAt(j--) - '0' : 0;  // j--先进行表达式运算,再进行自增运算
            sum += carry;

            carry = sum / 2;
            sb.append(sum % 2);  //apend
        }
        return sb.reverse().toString(); //reverse()反转
    }


方法2:3ms

没使用条件运算符
计算结果时,是直接在字符串首insert()。方法1是在字符串尾append(),最后再将字符串反转reverse()

public String addBinary(String a, String b) {
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;  //进位
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0){
            int sum = 0;

            if (i >= 0)
                sum += a.charAt(i--) - '0';
            if (j >= 0)
                sum += b.charAt(j--) - '0';  // j--先进行表达式运算,再进行自增运算
            sum += carry;

            carry = sum / 2;
            sb.insert(0, sum % 2);
        }
        if (carry == 1)
            sb.insert(0, 1);
        return sb.toString();
    }


方法3:5ms 很麻烦。。

字符串前补零,本来想用String.format(“%04d”, Number),但是Integer.parseInt(s)当string太长就会超出int范围报错
java中数字左侧补零

public String addBinary2(String a, String b) {
        int len = Math.max(a.length() , b.length());
        String str1 = "", str2 = "";
        for (int i = 0; i < len - a.length(); i++) {
            str1 = "0" + str1;
        }
        for (int i = 0; i < len - b.length(); i++) {
            str2 = "0" + str2;
        }
        StringBuilder sb1 = new StringBuilder(a);
        String newa = sb1.insert(0, str1).toString();
        StringBuilder sb2 = new StringBuilder(b);
        String newb = sb2.insert(0, str2).toString();

        char[] awords = newa.toCharArray();
        char[] bwords = newb.toCharArray();

        StringBuilder sb = new StringBuilder();
        int flag = 0; //进位
        for (int i = len - 1; i >= 0; i--) {
            int A = awords[i] - '0';
            int B = bwords[i] - '0';
            if (A + B + flag >= 2){
                sb.insert(0, A + B + flag - 2);
                flag = 1;
            }
            else {
                sb.insert(0, A + B + flag);
                flag = 0;
            }
        }
        if (flag == 1)
            sb.insert(0, 1);

        return sb.toString();
    }



猜你喜欢

转载自blog.csdn.net/gaoruowen1/article/details/80967784
今日推荐