青训营豆包 | 豆包MarsCode AI 刷题

43 阅读2分钟

二进制之和

题目分析

你需要将两个二进制字符串相加,并将结果转换为十进制字符串。由于二进制字符串可能非常长,常规的整数类型可能无法处理,因此需要一种能够处理大数的方法。

解决思路

数据结构选择

  • StringBuilder: 用于存储逐位相加的结果,最后可以方便地进行反转。
  • 整数变量: 用于存储进位信息。

算法步骤

  1. 逐位相加: 从两个二进制字符串的最低位(即最右端)开始,逐位相加,并记录进位。
  2. 处理进位: 在每一位相加时,需要考虑前一位的进位。
  3. 反转结果: 由于是从低位到高位逐位相加的,最终结果需要反转。
  4. 二进制转十进制: 将最终的二进制字符串转换为十进制字符串。

63b38b87bc6f492ce5fb5cffbaf008f.png 使用 StringBuilder 来存储最终的二进制结果,StringBuilder 是可变的字符串类,在拼接字符串时比 String 更高效。 初始化 carry 变量为 0(用于保存加法中的进位),并分别初始化 ij 为两个字符串的最后一位索引(即从右向左开始处理二进制位)。

93212cc991ed9bf21492cb41eaca324.png while 循环的条件判断包括三部分:

  • i >= 0 表示如果 binary1 还有未处理的位。

  • j >= 0 表示如果 binary2 还有未处理的位。

  • carry != 0 表示如果上一次加法有进位,需要继续处理。

  • 通过 charAt(i) 获取当前二进制字符串的某一位(从右到左),并将其字符 '0' 或 '1' 转换为对应的整数 0 或 1。如果 i 或 j 超出了字符串的范围,则默认当前位为 0。 结果反转:由于 StringBuilder 在加法过程中是从最低位(右边)开始处理的,所以最终的二进制结果是逆序的。调用 reverse() 方法反转字符串,使其从高位到低位。

526dfdad0ecf4086b365dc06ec04cf8.pngStringBuilder 中的二进制结果转换为字符串,然后使用 Integer.parseInt(binaryResult, 2) 将二进制字符串解析为十进制整数,再使用 Integer.toString() 将其转换为十进制字符串并返回。

总结:

  • 核心思想:模拟二进制加法,逐位处理两个二进制字符串,计算每一位的和和进位,最终得到二进制结果,并将其转换为十进制返回。
  • 时间复杂度:每次循环都会移动 i 和 j,因此循环次数是两个字符串的最大长度,时间复杂度为 O(n),其中 n 是较长的字符串长度。

这段代码是一个常见的二进制加法实现,利用了逐位加法和进位的处理,适用于处理任意长度的二进制加法。