二进制之和
题目分析
你需要将两个二进制字符串相加,并将结果转换为十进制字符串。由于二进制字符串可能非常长,常规的整数类型可能无法处理,因此需要一种能够处理大数的方法。
解决思路
数据结构选择
- StringBuilder: 用于存储逐位相加的结果,最后可以方便地进行反转。
- 整数变量: 用于存储进位信息。
算法步骤
- 逐位相加: 从两个二进制字符串的最低位(即最右端)开始,逐位相加,并记录进位。
- 处理进位: 在每一位相加时,需要考虑前一位的进位。
- 反转结果: 由于是从低位到高位逐位相加的,最终结果需要反转。
- 二进制转十进制: 将最终的二进制字符串转换为十进制字符串。
使用
StringBuilder 来存储最终的二进制结果,StringBuilder 是可变的字符串类,在拼接字符串时比 String 更高效。
初始化 carry 变量为 0(用于保存加法中的进位),并分别初始化 i 和 j 为两个字符串的最后一位索引(即从右向左开始处理二进制位)。
while 循环的条件判断包括三部分:
-
i >= 0表示如果binary1还有未处理的位。 -
j >= 0表示如果binary2还有未处理的位。 -
carry != 0表示如果上一次加法有进位,需要继续处理。 -
通过
charAt(i)获取当前二进制字符串的某一位(从右到左),并将其字符'0'或'1'转换为对应的整数0或1。如果i或j超出了字符串的范围,则默认当前位为0。 结果反转:由于StringBuilder在加法过程中是从最低位(右边)开始处理的,所以最终的二进制结果是逆序的。调用reverse()方法反转字符串,使其从高位到低位。
将
StringBuilder 中的二进制结果转换为字符串,然后使用 Integer.parseInt(binaryResult, 2) 将二进制字符串解析为十进制整数,再使用 Integer.toString() 将其转换为十进制字符串并返回。
总结:
- 核心思想:模拟二进制加法,逐位处理两个二进制字符串,计算每一位的和和进位,最终得到二进制结果,并将其转换为十进制返回。
- 时间复杂度:每次循环都会移动
i和j,因此循环次数是两个字符串的最大长度,时间复杂度为 O(n),其中n是较长的字符串长度。
这段代码是一个常见的二进制加法实现,利用了逐位加法和进位的处理,适用于处理任意长度的二进制加法。