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

60 阅读5分钟

代码解析与思路

代码功能

代码实现两个二进制字符串的加法运算,并返回它们的十进制和作为字符串。

思路

  1. 初始化

    • 使用一个StringBuilder对象result来存储计算结果。
    • 初始化一个进位变量carry为0。
    • 使用两个指针ij分别指向两个二进制字符串的末尾(因为加法是从低位到高位进行的)。
  2. 逐位相加

    • 使用一个while循环,条件是i >= 0j >= 0carry > 0中的任意一个为真。
    • 在每次循环中,首先把carry加到sum中。
    • 如果i还有效(即指向一个字符),则将当前字符转换为数字(通过减去字符'0')并加到sum中。
    • 如果j还有效,同样将当前字符转换为数字并加到sum中。
    • 计算当前位的和(sum % 2),并将其插入到result的开头(因为是从低位开始计算的)。
    • 更新进位(carry = sum / 2)。
  3. 返回结果

    • result转换为字符串,然后使用Integer.parseInt(result.toString(), 2)将其从二进制解析为十进制整数。
    • 将十进制整数转换为字符串并返回。

图解

  • 假设有两个二进制数:"101" 和 "110"。
  • 从最低位开始相加,得到:1 (carry 0), 0+1=1 (carry 0), 1+1=2 (carry 1, write down 0), carry 1(因为最高位相加有进位)。
  • 所以结果是"1011"(二进制),转换为十进制是5。

代码实现

public class Main {
    // 定义一个静态方法,接收两个二进制字符串作为参数,返回它们的十进制和(字符串形式)
    public static String solution(String binary1, String binary2) {
        // 创建一个StringBuilder对象,用于构建二进制结果
        StringBuilder result = new StringBuilder();
        // 初始化进位为0
        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';

            // 将当前位的和(0或1)插入到StringBuilder的开头,因为是从低位开始计算的
            result.insert(0, sum % 2);
            // 更新进位值
            carry = sum / 2;
        }

        // 将StringBuilder中的二进制字符串转换为十进制整数,并转换为字符串返回
        return Integer.toString(Integer.parseInt(result.toString(), 2));
    }

    // 主方法,用于测试solution方法
    public static void main(String[] args) {
        // 测试样例1,输出应为true,因为"101" + "110" = 5(十进制)
        System.out.println(solution("101", "110").equals("5"));
        // 测试样例2,输出应为true,因为"111111" + "10100" = 83(十进制)
        System.out.println(solution("111111", "10100").equals("83"));
        // 测试样例3,输出应为true,因为"111010101001001011" + "100010101001" = 242420(十进制)
        System.out.println(solution("111010101001001011", "100010101001").equals("242420"));
        // 测试样例4,输出应为true,因为"111010101001011" + "10010101001" = 31220(十进制)
        System.out.println(solution("111010101001011", "10010101001").equals("31220"));
        // 测试样例5,输出应为true,因为"11" + "1" = 4(十进制),注意这里比较的是字符串"4",不是二进制"11"的字符串形式
        System.out.println(solution("11", "1").equals("4"));
    }
}

AI辅助的作用

在编写这道二进制之和的算法题目中,AI辅助的作用主要体现在以下几个方面:

  1. 提供思路:AI可以帮助理解问题的本质,提供解决问题的基本思路,如逐位相加、处理进位等。

  2. 代码生成与修正:AI可以生成初步的代码框架,或者在已有的代码基础上进行修正和优化。这在本例中尤为明显,AI可能帮助生成了逐位相加和进位处理的逻辑。

  3. 解释与验证:AI可以解释每一步的运算过程,验证结果的正确性,以及提供错误分析和修正建议。

如何更好地利用AI辅助学习

  1. 明确问题:在使用AI辅助之前,先明确自己要解决的问题是什么,以及期望得到什么样的帮助。

  2. 主动思考:不要完全依赖AI来解决问题,而是要在AI的帮助下进行主动思考,理解问题的本质和解决方法。

  3. 验证与理解:在使用AI生成的代码或解决方案后,要进行验证和理解,确保自己真正掌握了相关的知识和技能。

  4. 实践与探索:在掌握基本方法后,可以尝试自己解决问题,或者探索更复杂的场景和问题,以加深对知识的理解和应用。

  5. 反馈与迭代:在使用AI辅助学习的过程中,要及时给AI提供反馈,以便AI能够更准确地理解你的需求,并提供更有效的帮助。同时,也要根据AI的反馈进行迭代和优化自己的学习方法。