青训营—二进制之和

180 阅读3分钟

题目描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

测试样例

样例1

输入:binary1 = "101" ,binary2 = "110"
输出:'11

样例2

输入:binary1 = "111111" ,binary2 = "10100"
输出:'83'

样例3

输入:binary1 = "111010101001001011" ,binary2 = "100010101001"
输出:'242420'

样例4

输入:binary1 = "111010101001011" ,binary2 = "10010101001"
输出:'31220'

样例5

输入:binary1 = "11" ,binary2 = "1"
输出:'4'

思路

  1. 对齐二进制字符串:首先,需要确保两个二进制字符串的长度相同。可以通过在较短的字符串前面补零来实现这一点。
  2. 逐位相加:从字符串的最低位(右侧)开始逐位相加,同时考虑进位。对于每一位,将两个对应的二进制位和进位相加,计算出当前位的结果和新的进位。
  3. 构建结果:将每一位的结果存储在一个字符串构建器中,最后反转这个结果字符串以得到正确的顺序。
  4. 转换为十进制:最后,将得到的二进制结果字符串转换为十进制数并返回。

Java代码

public class Main {
    public static String solution(String binary1, String binary2) {
        // Please write your code here
        // 找到最长的字符串长度
        int maxLength = Math.max(binary1.length(), binary2.length());

        // 左边补0对齐
        binary1 = String.format("%" + maxLength + "s", binary1).replace(' ', '0');
        binary2 = String.format("%" + maxLength + "s", binary2).replace(' ', '0');

        int carry = 0;
        StringBuilder result = new StringBuilder();

        // 从右往左进行相加
        for (int i = maxLength - 1; i >= 0; i--) {
            int b1 = binary1.charAt(i) - '0';
            int b2 = binary2.charAt(i) - '0';
            int total = b1 + b2 + carry;

            // 计算当前位的和和进位
            result.append(total % 2);
            carry = total / 2;
        }

        // 如果有进位剩余
        if (carry != 0) {
            result.append(carry);
        }

        // 反转结果并转换为十进制字符串
        result.reverse();
        return String.valueOf(Integer.parseInt(result.toString(), 2));
    }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution("101", "110").equals("11"));
        System.out.println(solution("111111", "10100").equals("83"));
        System.out.println(solution("111010101001001011", "100010101001").equals("242420"));
        System.out.println(solution("111010101001011", "10010101001").equals("31220"));
    }
}

复杂度分析

时间复杂度:算法主要由两个部分组成:对齐字符串和逐位相加。对齐字符串的时间复杂度是 O(n),其中 n 是较长字符串的长度。逐位相加的时间复杂度也是 O(n)。因此,总的时间复杂度为 O(n)

空间复杂度:使用了一个字符串构建器来存储结果,空间复杂度为 O(n),用于存储最终的二进制结果字符串。