[LeetCode] #67 二进制求和

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

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

输入: a = "11", b = "1"

输出: "100"

首先,循环相加两个字符串相同长度的低位数部分;

如果 a 还没遍历完成(a串比b串长),则继续遍历添加 a 的剩余部分;

如果 b 还没遍历完成(b串比a串长),则继续遍历添加 b 的剩余部分;

如果 carry 等于1,表示还有一次进位;

最后,反转字符串获得正常结果。

class Solution {
    public String addBinary(String a, String b) {
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;
        StringBuilder builder = new StringBuilder();

        while (i >= 0 && j >= 0) {
            int sum = carry;
            sum += a.charAt(i--) - '0';
            sum += b.charAt(j--) - '0';
            carry = sum / 2;
            builder.append(sum % 2);
        }

        while (i >= 0) {
            int sum = carry + a.charAt(i--) - '0';
            carry = sum / 2;
            builder.append(sum % 2);
        }
        
        while (j >= 0) {
            int sum = carry + b.charAt(j--) - '0';
            carry = sum / 2;
            builder.append(sum % 2);
        }
        
        if (carry == 1) {
            builder.append(carry);
        }
        
        return builder.reverse().toString();
    }
}

化简

class Solution {
    public String addBinary(String a, String b) {
        StringBuffer ans = new StringBuffer();

        int n = Math.max(a.length(), b.length()), carry = 0;
        for (int i = 0; i < n; ++i) {
            carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
            carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
            ans.append(carry%2);
            carry /= 2;
        }

        if (carry == 1) {
            ans.append(carry);
        }

        return ans.reverse().toString();
    }
}

另一种思路,先将a和b转化成十进制数,求和后再转化为二进制数。

import java.math.BigInteger;
class Solution {
    public String addBinary(String a, String b) {
        return new BigInteger(a, 2).add(new BigInteger(b, 2)).toString(2);
    }
}

知识点:

java中char转int

char c = '1';
int i = c - '0';

StringBuilder的append方法

 

 BigInteger构造函数

1、BigInteger(byte[] val)
这个构造函数用于转换一个字节数组包含BigInteger的二进制补码,以二进制表示成一个BigInteger。

(用字节数组中值的ASCII码构造BigInteger)

2、BigInteger(int signum, byte[] magnitude)
此构造函数用于将BigInteger的符号大小表示法转换成一个BigInteger值。

(和第一种一样,增加了符号:1,0,-1)

3、BigInteger(int bitLength, int certainty, Random rnd)
此构造函数用于构造一个随机生成正BigInteger的可能是以指定的bitLength的素数。

(bitLength:返回的 BigInteger 的 bitLength;

certainty:调用方允许的不确定性的度量。新的 BigInteger 表示素数的概率超出 (1 - 1/2certainty)。此构造方法的执行时间与此参数的值是成比例的;

rnd:随机比特源,用这些随机比特选择用来进行质数测试的候选数。)

4、BigInteger(int numBits, Random rnd)
此构造函数用于构造一个随机生成的BigInteger,范围在0到 (2numBits - 1), 包括边界值。

5、BigInteger(String val)
此构造函数用于将十进制的字符串转换成一个BigInteger值表示形式。

6、BigInteger(String val, int radix)
这个构造函数用于将指定基数的数值字符串转换为BigInteger表示形式。

总结:

遍历长短不一的序列时,可以先遍历相同部分,再遍历剩余部分;

若同时遍历,需要判断短序列是否结束,结束则使其执行无效操作。

posted @ 2021-07-28 17:36  1243741754  阅读(170)  评论(0编辑  收藏  举报