题目解析
在这个问题中,我们需要设计一个算法,将两个二进制字符串相加,并以十进制的形式返回结果。由于二进制字符串可能非常长,常规的数值类型可能无法处理,因此我们需要使用字符串操作来实现这一功能。我们的目标是确保算法的时间复杂度不超过 O(n^2)。问题描述:
-
输入:两个二进制字符串 binary1 和 binary2。
-
输出:它们的和以十进制字符串的形式返回。
示例:
-
输入:binary1 = "101",binary2 = "110",输出:'11'
-
输入:binary1 = "111111",binary2 = "10100",输出:'83'
-
输入:binary1 = "111010101001001011",binary2 = "100010101001",输出:'242420'
解决思路
1. 对齐字符串:首先,我们需要确保两个二进制字符串的长度相同。可以通过在较短的字符串前面补零来实现。
- 逐位相加:从字符串的最后一位开始逐位相加,考虑进位。每一位的和可以通过 bit1 + bit2 + carry 计算,结果的当前位为 sum % 2,进位为 sum / 2。
3. 处理最后的进位:如果在最后一位相加后还有进位,需要将进位添加到结果中。
- 反转结果:由于我们是从低位到高位进行相加的,因此最终结果需要反转。
5. 转换为十进制:将最终的二进制结果转换为十进制字符串。
代码实现
以下是实现该逻辑的 Java 代码:
public class Main {
public static String solution(String binary1, String binary2) {
// 对齐字符串
int maxLength = Math.max(binary1.length(), binary2.length());
binary1 = alignString(binary1, maxLength);
binary2 = alignString(binary2, maxLength);
// 逐位相加
StringBuilder result = new StringBuilder();
int carry = 0;
for (int i = maxLength - 1; i >= 0; i--) {
int bit1 = binary1.charAt(i) - '0';
int bit2 = binary2.charAt(i) - '0';
int sum = bit1 + bit2 + carry;
result.append(sum % 2);
carry = sum / 2;
}
// 处理最后的进位
if (carry != 0) {
result.append(carry);
}
// 反转结果并转换为十进制
String binaryResult = result.reverse().toString();
return binaryToDecimal(binaryResult);
}
// 辅助函数:对齐字符串
private static String alignString(String s, int length) {
// 补0
return "0".repeat(length - s.length()) + s;
}
// 辅助函数:二进制转十进制
private static String binaryToDecimal(String binary) {
// 将二进制字符串转换为十进制字符串
return Long.toString(Long.parseLong(binary, 2));
}
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. 对齐字符串:使用 alignString 方法将两个字符串对齐,确保它们的长度相同。通过在较短的字符串前面补零来实现。
2.逐位相加:在 solution 方法中,从字符串的最后一位开始逐位相加。使用 StringBuilder 来构建结果字符串,避免频繁的字符串拼接。
3.进位处理:在每次相加时,计算当前位的和和进位。将当前位的结果添加到 StringBuilder 中。
4. 反转结果:由于我们是从低位到高位进行相加的,因此在完成相加后需要反转结果。 5. 转换为十进制:使用 Long.parseLong 方法将二进制字符串转换为十进制字符串。
知识总结
在使用豆包MarsCode AI刷题的过程中,我总结了以下几点新知识:
-
字符串操作:在处理大数时,字符串操作是非常重要的。通过字符串的逐位处理,可以有效避免数值溢出的问题。
-
时间复杂度分析:该算法的时间复杂度为 O(n),其中 n 是较长的二进制字符串的长度。逐位相加的过程是线性的,符合题目要求。
-
进位处理:在二进制加法中,进位的处理是关键。理解进位的概念对于实现正确的加法逻辑至关重要。
学习计划
结合豆包MarsCode AI刷题功能,我制定了以下高效学习方法: 1. 制定刷题计划:每天固定时间进行刷题,选择不同类型的问题以提高综合能力。可以设定每周的主题,例如字符串处理、动态规划等,确保全面覆盖。 2. 利用错题进行针对性学习:记录错题,分析错误原因,进行针对性练习。可以将错题整理成笔记,定期复习,帮助加深记忆。 3. 定期复习:每周复习之前做过的题目,巩固记忆。可以使用间隔重复法,帮助记忆更持久。
工具运用
我将 AI 刷题功能与其他学习资源相结合,取得了更好的学习效果。例如:
-
结合视频教程:在刷题时观看相关视频,帮助理解复杂的算法。视频中的讲解可以提供不同的视角,帮助更好地理解问题。
-
参与讨论:在学习社区中与其他同学讨论问题,分享解题思路和经验。通过讨论,可以获得新的思路和方法,拓宽自己的视野。
-
使用在线编程平台:在刷题时,使用在线编程平台进行实时测试,帮助快速验证自己的代码。
通过这些方法,我的编程能力得到了显著提升。希望这些经验能对其他入门同学有所帮助!在学习编程的过程中,保持耐心和恒心是非常重要的,遇到困难时不要气馁,积极寻求帮助和资源,最终一定能取得进步。