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

89 阅读4分钟

No55 二进制之和

问题描述:

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

解题思路:

  • 输入是两个二进制字符串
  • 输出是二个二进制字符串相加后的十进制结果
  • 可以使用Java的内置方法来处理二进制字符串和十进制转换

这个题目的算法步骤很简单:

  • 将二进制字符串转换为十进制

  • 将两个十进制相加

  • 将结果转换为字符串并返回。

    示范代码如下:

     public static String solution(String binary1, String binary2) {
             // 将二进制字符串转换为十进制整数
             int num1 = Integer.parseInt(binary1, 2);
             int num2 = Integer.parseInt(binary2, 2);
             
             // 将两个十进制整数相加
             int sum = num1 + num2;
             
             // 将结果转换为字符串并返回
             return Integer.toString(sum);
         }
    

    上述思路及代码,使用的Java内置方法来实现的,但是未考虑题目中说明的他们的二进制串可能非常长,所以常规方法可能无法处理大树问题,所以

    解题思路

    1. 将二进制字符串转换为十进制数(大整数模拟)

      • 由于二进制串可能很长,直接使用 Java 内置的基本数据类型(如intlong等)无法处理大数情况,所以我们需要模拟大整数的运算来将二进制字符串转换为十进制数。
      • 从二进制字符串的最低位(最右边)开始,依次遍历每个字符,对于每一位,如果是1,则将对应的权值(2的相应幂次)累加到结果中。例如,对于二进制字符串"101",最低位的1对应的权值是2^0 = 1,中间的0对应的权值是2^1 = 2(但由于是0,所以不做累加),最高位的1对应的权值是2^2 = 4,最终这个二进制数转换为十进制就是1 + 4 = 5
      • 为了方便计算幂次,可以使用一个变量来记录当前的权值,每移动一位,权值就乘以2
    2. 对两个转换后的十进制数进行求和

      • 按照常规的加法运算,将上述得到的两个十进制数相加,得到它们的和。
    3. 将求和结果转换回十进制表示形式

      • 这个步骤相对简单,最终的和就是我们要求的结果,以十进制的形式呈现即可。

         public static String solution(String binary1, String binary2) {
                 // 将二进制字符串1转换为十进制数
                 int num1 = binaryToDecimal(binary1);
                 // 将二进制字符串2转换为十进制数
                 int num2 = binaryToDecimal(binary2);
                 // 求两个十进制数的和
                 int sum = num1 + num2;
                 return "" + sum;
             }
         ​
             private static int binaryToDecimal(String binary) {
                 int decimal = 0;
                 int power = 1;
                 for (int i = binary.length() - 1; i >= 0; i--) {
                     if (binary.charAt(i) == '1') {
                         decimal += power;
                     }
                     power *= 2;
                 }
                 return decimal;
             }
        

在上述代码中:

  • solution方法是对外的接口,接收两个二进制字符串参数,先分别调用binaryToDecimal方法将它们转换为十进制数,然后求和并返回最终结果。
  • binaryToDecimal方法实现了将二进制字符串转换为十进制数的功能,通过从右往左遍历二进制字符串,根据每一位是否为1来累加相应的权值,最终得到对应的十进制数。

整体算法中,binaryToDecimal方法遍历二进制字符串一次,时间复杂度为O(n)n为二进制字符串的长度),addBinaryStrings方法中主要的操作是调用两次binaryToDecimal方法和一次简单的加法操作,整体时间复杂度依然保持在O(n),满足不超过O(n^2)的要求。

需要注意的是,上述代码只是一个简单的示例,如果要处理更复杂的情况(比如输入的二进制字符串长度非常长,可能导致整数溢出等),还可以进一步优化,例如采用BigInteger类来更稳健地处理大整数运算,但那样代码结构会稍有不同,这里主要是按照手动模拟大整数运算的思路来展示解题过程。