1.问题描述
小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'
难度等级
困难
题目链接
2.解题思路
这道求二进制之和的题目虽然被定义为困难题,但其实并不困难。它要求我们将两个二进制数相加并以十进制的形式返回,我们可以先将两个数转化为十进制,然后将两个数相加,返回即可。
虽然题目给我们的二进制是字符串的形式,但是将它转化为整数形式也不难。我们到知道,二进制每一位的权都是2^(位数-1),所以我们可以用一个for循环,从最右边开始,将每一位取出来乘以它的权,再累加到整数变量当中。这里很巧的事情是,每一位在字符串中的索引+位数刚好等于字符串的长度。假设我们的索引是0,那么位数就是length。
//将二进制字符串转换为十进制数字
int num1 = 0;
for(int i = binary1.length()-1; i >= 0; i--){
//将每个字符转换为数字
num1 += (binary1.charAt(i)-'0') * Math.pow(2,binary1.length() - 1 - i);
}
我们可以通过循环将两个二进制字符串转为为十进制整数之和,直接相加返回即可。
return Integer.toString(num1+num2);
3.代码展示
public class Main {
public static String solution(String binary1, String binary2) {
// Please write your code here
//将二进制字符串转换为十进制数字
int num1 = 0;
for(int i = binary1.length()-1; i >= 0; i--){
//将每个字符转换为数字
num1 += (binary1.charAt(i)-'0') * Math.pow(2,binary1.length() - 1 - i);
}
int num2 = 0;
for(int i = binary2.length()-1; i >= 0; i--){
num2 += (binary2.charAt(i)-'0') * Math.pow(2,binary2.length()-1-i);
}
return Integer.toString(num1+num2);
}
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"));
}
}
4.总结
这道题考察的是对二进制数的基本认识,只要成功将二进制数转化为十进制数,这道题就迎刃而解了。好了,这道题就简单啰嗦到这里,祝大家刷题愉快~