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

119 阅读3分钟

二进制之和

问题描述

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

解题思路

二进制数字的加法通常是按位操作,进而将结果转换为十进制。但在面对非常长的二进制字符串时,直接使用常规操作可能因溢出或性能限制而失败。因此,我们需要借助能够处理大数的工具,并确保时间复杂度不超过O(n2)O(n^2)。在Java中,我们可以借助 BigInteger 类高效地完成这一任务。BigInteger 支持任意精度的算术运算,并提供了从二进制转换到十进制的能力,这完美地契合了问题需求。

不过还需要对BigInteger源码进行分析,确保时间复杂度不超过O(n2)O(n^2)

image.png

上面提供了BigInteger中转换为2进制表示的一部分代码,可以看到除了一些细节判断代码外,while循环是整段代码的瓶颈,其中调用了destructiveMulAdd说明转换过程需要用到乘法,而乘法实现一般是用单层for循环,那么外层while循环,内层for循环,得出复杂度是O(n2)O(n^2),符合题意。

代码:

import java.math.BigInteger;
public class Main {
    // 二进制字符串求和
    public static String solution(String binary1, String binary2) {
        // 使用 BigInteger 处理大数问题
        BigInteger bi1 = new BigInteger(binary1, 2); // 将二进制字符串转为大数
        BigInteger bi2 = new BigInteger(binary2, 2); 
        return bi1.add(bi2).toString(); // 加法运算后转为十进制字符串
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution("101", "110").equals("11")); // 输出: 11
        System.out.println(solution("111111", "10100").equals("83")); // 输出: 83
        System.out.println(solution("111010101001001011", "100010101001").equals("242420")); // 输出: 242420
        System.out.println(solution("111010101001011", "10010101001").equals("31220")); // 输出: 31220
    }
}

代码解析:

该算法利用了 BigInteger 的强大功能,以简单、优雅的方式解决了二进制字符串求和问题。其核心优势在于:

  1. 高效性:能够处理非常大的二进制字符串。
  2. 易用性:代码简洁明了,无需手动实现进位操作。
  3. 通用性:适用于各种大数运算场景。

对于类似的大数问题,BigInteger 是一个强大的工具,值得在开发中广泛应用。