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

67 阅读4分钟

public class Main {

public static String solution(String binary1, String binary2) {
    // 找到最长的字符串长度
    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) {
    System.out.println(solution("101", "110").equals("11")); // 输出: true
    System.out.println(solution("111111", "10100").equals("83")); // 输出: true
    System.out.println(solution("111010101001001011", "100010101001").equals("242420")); // 输出: true
    System.out.println(solution("111010101001011", "10010101001").equals("31220")); // 输出: true
}

}

这段代码的目的是实现两个二进制字符串的加法,并将结果转换为十进制字符串。下面是代码的简要解释:

  1. 方法定义

    public static String solution(String binary1, String binary2) {
    

    定义一个静态方法 solution,接收两个二进制字符串 binary1binary2

  2. 确定最大长度

    int maxLength = Math.max(binary1.length(), binary2.length());
    

    计算两个字符串中较长的长度,用于后续的字符串对齐。

  3. 字符串补零

    binary1 = String.format("%" + maxLength + "s", binary1).replace(' ', '0');
    binary2 = String.format("%" + maxLength + "s", binary2).replace(' ', '0');
    

    将较短的二进制字符串左侧补零,以确保两个字符串等长。

  4. 初始化进位

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

    初始化进位 carry 为0,并创建一个 StringBuilder 用于存储结果。

  5. 从右向左进行逐位相加

    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;
    }
    

    遍历两个字符串的每一位,从右到左相加。每次计算这一位的和和新的进位。结果通过 total % 2 获取当前位,进位通过 total / 2 更新。

  6. 处理剩余进位

    if (carry != 0) {
        result.append(carry);
    }
    

    如果最后还有进位,添加到结果中。

  7. 反转结果并转换为十进制字符串

    result.reverse();
    return String.valueOf(Integer.parseInt(result.toString(), 2));
    

    反转字符串结果(因为是从后向前构建),然后将二进制字符串转换为十进制整型,再返回其字符串表示。

  8. 测试输出

    public static void main(String[] args) {
        // 测试用例
    }
    

    main 方法中,通过几个测试用例验证 solution 方法的正确性。

综上所述,这段代码实现了二进制字符串的加法,并返回十进制表示的结果。 这个代码的目标是将两个二进制字符串相加并返回它们的十进制表示。 下面是这个方法的主要步骤和原理说明:

  1. 对齐长度

    • 计算两个二进制字符串的最大长度 maxLength
    • 使用 String.format 方法对较短的字符串在左边补零,以确保两个字符串的长度相等。
  2. 逐位相加

    • 通过一个 for 循环从字符串的最右边开始一位一位地相加,直到最左边。
    • 对于每一位,相应的字符被转为整数(b1b2),并加上当前的进位(carry)。进位初始为0。
  3. 计算和与进位

    • 通过 total = b1 + b2 + carry 计算当前位的总和。
    • 使用 total % 2 计算当前位的结果,并将其追加到结果字符串中。
    • 使用 total / 2 更新进位,准备进行下一位的计算。
  4. 处理最终的进位

    • 如果在最后一位的计算后仍有进位(即 carry 不为0),则将其添加到结果中。
  5. 结果反转与转换

    • 由于我们是从最低位开始构建结果,最终需要将结果反转。
    • 将反转后的二进制字符串使用 Integer.parseInt 转换为十进制整数。

总结

总的来说,这段代码有效地模拟了手动进行二进制加法的过程,并将最终的结果返回为十进制字符串。代码关注以下几个方面:

  • 字符串长度对齐,确保可以逐位计算。
  • 处理进位,确保每一位的加法正确。
  • 将结果从二进制转换为十进制。