题目描述
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。
测试样例
样例1
输入:binary1 = "101" ,binary2 = "110"
输出:'11
样例2
输入:binary1 = "111111" ,binary2 = "10100"
输出:'83'
样例3
输入:binary1 = "111010101001001011" ,binary2 = "100010101001"
输出:'242420'
样例4
输入:binary1 = "111010101001011" ,binary2 = "10010101001"
输出:'31220'
样例5
输入:binary1 = "11" ,binary2 = "1"
输出:'4'
思路
- 对齐二进制字符串:首先,需要确保两个二进制字符串的长度相同。可以通过在较短的字符串前面补零来实现这一点。
- 逐位相加:从字符串的最低位(右侧)开始逐位相加,同时考虑进位。对于每一位,将两个对应的二进制位和进位相加,计算出当前位的结果和新的进位。
- 构建结果:将每一位的结果存储在一个字符串构建器中,最后反转这个结果字符串以得到正确的顺序。
- 转换为十进制:最后,将得到的二进制结果字符串转换为十进制数并返回。
Java代码
public class Main {
public static String solution(String binary1, String binary2) {
// Please write your code here
// 找到最长的字符串长度
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) {
// You can add more test cases here
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"));
}
}
复杂度分析
时间复杂度:算法主要由两个部分组成:对齐字符串和逐位相加。对齐字符串的时间复杂度是 O(n),其中 n 是较长字符串的长度。逐位相加的时间复杂度也是 O(n)。因此,总的时间复杂度为 O(n)。
空间复杂度:使用了一个字符串构建器来存储结果,空间复杂度为 O(n),用于存储最终的二进制结果字符串。