问题描述
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。
解题思路
-
二进制转十进制:
- 将二进制字符串转换为十进制整数。这可以通过遍历字符串中的每个字符,根据其位置计算出对应的十进制值来实现。
- 例如,二进制字符串
"101"对应的十进制值为1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 5。
-
十进制数相加:
- 将两个转换后的十进制数相加。
-
返回结果:
- 将相加后的十进制数转换为字符串并返回。
代码分析
主函数 solution
public static String solution(String binary1, String binary2) {
long decimal1 = binaryToDecimal(binary1);
long decimal2 = binaryToDecimal(binary2);
long ans = decimal1 + decimal2;
return String.valueOf(ans);
}
- 参数:
binary1和binary2是两个二进制字符串。 - 步骤:
- 调用
binaryToDecimal函数将binary1转换为十进制数decimal1。 - 调用
binaryToDecimal函数将binary2转换为十进制数decimal2。 - 计算
decimal1和decimal2的和ans。 - 将
ans转换为字符串并返回。
- 调用
辅助函数 binaryToDecimal
private static long binaryToDecimal(String binaryStr) {
long decimal = 0;
int length = binaryStr.length();
for (int i = 0; i < length; i++) {
char c = binaryStr.charAt(length - 1 - i);
if (c == '1') {
decimal += Math.pow(2, i);
}
}
return decimal;
}
- 参数:
binaryStr是一个二进制字符串。 - 步骤:
- 初始化
decimal为 0,用于存储最终的十进制值。 - 获取
binaryStr的长度length。 - 遍历
binaryStr的每个字符:- 从右到左(即从最低位到最高位)遍历字符串。
- 如果当前字符是
'1',则将2的当前位次幂加到decimal上。
- 返回计算得到的十进制值
decimal。
- 初始化
优化代码
-
- 使用
Math.pow(2, i)每次计算幂运算可能会导致性能问题。可以使用位移操作1L << i来替代Math.pow(2, i),这样可以提高效率。 - 例如,
1L << i等价于2^i。
- 使用
-
- 可以直接使用 Java 内置的
Long.parseLong方法将二进制字符串转换为十进制数,这样可以简化代码。
- 可以直接使用 Java 内置的
优化后的代码
public static String solution(String binary1, String binary2) {
long decimal1 = Long.parseLong(binary1, 2);
long decimal2 = Long.parseLong(binary2, 2);
long ans = decimal1 + decimal2;
return String.valueOf(ans);
}
详细解释
Long.parseLong(binary1, 2):将二进制字符串binary1转换为十进制长整型数。Long.parseLong(binary2, 2):将二进制字符串binary2转换为十进制长整型数。String.valueOf(ans):将相加后的结果ans转换为字符串并返回。