二进制求和-LeetCode(Java实现)

题目描述:

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

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

示例 1:

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

示例 2:

输入: a = "10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"   
      b =  "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"
输出: "110111101100010011000101110110100000011101000101011001000011011000001100011110011010010011000000000"

解题思路:   如果先把两个二进制字符串转换成数字,再求和,最后变成字符串的话,在本题中很容易出现溢出情况。

  1. 因为二进制字符串的加和是从右往左计算,所以先反转两个二进制字符串(使用StringBuffer提供的方法)。后面的步骤都基于反转后的字符串进行操作。
  2. 创建一个StringBuffer变量用以存放求和后的二进制字符串(后面简称为存值字符串)。(使用StringBuffer类,是因为此类的字符串相加操作效率很高)
  3. 将两个字符串变成相同的长度(在短的字符串后面加字符 ‘0’ ,直到两个字符串长度相同)。
  4. 创建一个字符变量来存放需要往后进位的值(flag),初始值为 ‘0’。从左向右,给两个字符串同一位置的字符以及 flag 进行 ”求和操作“ (满二进一)。如果求和后,需要向下一位进位,就把需要进位的值,存放在flag中。每次求和操作都要考虑 flag 的值。
  5. 完成两字符串最后一个字符的求和操作后。判断此时flag的值,如果flag 是 ‘1’,则还需要在存值字符串后面加上 ‘1’;
  6. 完成以上操作后,再将存值字符反转,然后转换尘为String类,并返回此。

代码实现:

class Solution {
    public String addBinary(String a, String b) {
        //反转字符串
        StringBuffer s1 = new StringBuffer(a);
        s1.reverse();
        StringBuffer s2 = new StringBuffer(b);
        s2.reverse();
        //将两个字符串变成长度相同。
        if (s1.length() > s2.length()) {
            int n = s1.length() - s2.length();
            for (int i = 0; i < n; i++) {
                s2.append('0');
            }
        }else if (s1.length() < s2.length()) {
            int n = s2.length() - s1.length();
            for (int i = 0; i < n; i++) {
                s1.append('0');
            }
        }
        //进行两个字符串的求和操作
        StringBuffer stringBuffer = new StringBuffer("");
        int i = 0;
        char flag = '0'; //用来存放进位值的字符变量
        while (i < s1.length() && i < s2.length()) {
            if (flag == '0') {
                if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '1') {
                    flag = '1';
                    stringBuffer.append('0');
                }else if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '0') {
                    stringBuffer.append('0');
                }else {
                    stringBuffer.append('1');
                }
            } else {
                if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '1') {
                    flag = '1';
                    stringBuffer.append('1');
                }else if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '0'){
                    flag = '0';
                    stringBuffer.append('1');
                }else {
                    flag = '1';
                    stringBuffer.append('0');
                }
            }
            i++;
        }
        if (flag == '1') {
            stringBuffer.append(flag);
        }
        stringBuffer.reverse();
        return stringBuffer.toString();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43573824/article/details/88726567
今日推荐