二进制之和 | 豆包MarsCode AI刷题

30 阅读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. 补齐长度:首先,我们需要确保两个二进制字符串的长度相同。如果长度不同,可以在较短的字符串前面补0。
  2. 逐位相加:从最低位(字符串的最后一位)开始,逐位相加,并处理进位。
  3. 处理进位:如果某一位的和大于1,则需要进位。
  4. 转换为十进制:将最终的二进制结果转换为十进制。

代码实现

import java.math.BigInteger;

public class Main {
    public static String solution(String binary1, String binary2) {
        // 1. 补齐长度
        while (binary1.length() < binary2.length()) {
            binary1 = "0" + binary1;
        }
        while (binary2.length() < binary1.length()) {
            binary2 = "0" + binary2;
        }

        // 2. 逐位相加
        StringBuilder result = new StringBuilder();
        int carry = 0;
        for (int i = binary1.length() - 1; i >= 0; i--) {
            int bit1 = binary1.charAt(i) - '0';
            int bit2 = binary2.charAt(i) - '0';
            int sum = bit1 + bit2 + carry;
            result.append(sum % 2); // 当前位的结果
            carry = sum / 2; // 进位
        }

        // 3. 处理最后的进位
        if (carry != 0) {
            result.append(carry);
        }

        // 4. 将结果反转并转换为十进制
        String binaryResult = result.reverse().toString();
        return binaryToDecimal(binaryResult);
    }

    // 将二进制字符串转换为十进制字符串
    private static String binaryToDecimal(String binary) {
        // 使用BigInteger类来处理大数转换
        BigInteger decimal = new BigInteger(binary, 2);
        return decimal.toString();
    }

    public static void main(String[] args) {
        // 测试用例
        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"));
    }
}

知识总结

  1. 补齐长度:确保两个字符串长度相同。
  2. 逐位相加:从最低位开始逐位相加,并处理进位。
  3. 处理最后的进位:如果最高位有进位,需要将其添加到结果中。
  4. 二进制到十进制的转换:使用BigInteger类来处理大数转换。

binaryToDecimal方法

  • 使用BigInteger类的构造函数new BigInteger(binary, 2)将二进制字符串转换为BigInteger对象。
  • 使用toString()方法将BigInteger对象转换为十进制字符串。