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

0 阅读4分钟

二进制之和题目解析与代码实现

题目描述

小U和小R希望找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。二进制串可能非常长,需要在时间复杂度不超过O(n^2)的前提下完成任务。

输入格式

输入包含两个二进制字符串 binary1binary2

输出格式

输出一个字符串,表示两个二进制字符串相加后的十进制结果。

示例

// 样例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. 初始化

    • 创建一个 StringBuilder 对象用于构建结果字符串。
    • 初始化一个变量 carry 表示进位值,初始为0。
    • 定义两个指针 ij 分别指向两个输入字符串的末尾。
  2. 循环处理

    • 使用一个循环,当任一指针未达到字符串开头或仍有进位时继续执行。
    • 在每次迭代中,先将当前的进位值 carry 加到 sum 中。
    • 如果指针 ij 指向的位置有效,则读取对应的字符(即二进制位),将其转换为整数后加入 sum 中,并相应地移动指针。
    • 更新进位值 carrysum 整除2的结果,因为二进制数相加时超过1就需要进位。
    • sum 对2取模的结果追加到 StringBuilder 对象中,这代表了当前位的计算结果。
  3. 结果处理

    • 循环结束后,由于我们是从最低位开始计算并存储结果的,因此需要反转 StringBuilder 对象得到正确的结果顺序。
    • 利用 BigInteger 类将最终的二进制字符串转换成十进制数,并返回其字符串表示形式。

代码实现

import java.math.BigInteger;

public class Main {
    public static String solution(String binary1, String binary2) {
        StringBuilder result = new StringBuilder();
        int carry = 0;  // 进位
        int i = binary1.length() - 1;
        int j = binary2.length() - 1;

        while (i >= 0 || j >= 0 || carry > 0) {
            int sum = carry; // 先将进位加上
            if (i >= 0) {
                sum += binary1.charAt(i--) - '0'; // 将字符转换为数字
            }
            if (j >= 0) {
                sum += binary2.charAt(j--) - '0'; // 将字符转换为数字
            }
            carry = sum / 2; // 计算新的进位
            result.append(sum % 2); // 结果取余,转换为字符
        }

        result.reverse(); // 反转结果
        BigInteger decimalSum = new BigInteger(result.toString(), 2);
        return decimalSum.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"));
        System.out.println(solution("11", "1").equals("4"));
    }
}

学习建议

  1. 理解基本概念:深入理解二进制数的基本概念及其运算是解决此类问题的基础。可以通过阅读教材或在线资源来巩固这些基础知识。

  2. 练习编码技巧:实践是提高编程技能的关键。尝试自己动手实现上述算法,如果遇到困难,可以参考提供的代码逐步调试。

  3. 关注边界情况:在处理字符串操作时,特别注意边界情况,如空字符串、单个字符等,确保程序的健壮性。

  4. 利用标准库:了解并熟练使用Java标准库中的工具类,如本题中使用的 BigInteger 类,它们能极大简化开发工作,同时提供强大的功能支持。

  5. 优化算法性能:虽然题目要求的时间复杂度已经给出,但在实际工作中,优化算法性能始终是一个值得追求的目标。思考是否有更高效的方式来解决问题,比如利用位运算等技术。

通过这样的学习和实践,不仅可以加深对二进制运算的理解,还能提升解决实际问题的能力。希望每位读者都能从中学到有用的知识,并应用到未来的项目中。