问题描述
问题分析
简单模拟一下二进制相加的过程即可,思路如下:
- 两个字符串长度对齐:短的字符串前面补0,直到和长的字符串对齐。
- 逐项相加:相加情况只可能是0、1、2、3。
- 特殊情况处理:头部若需要进位,那么得在头部额外添加一位。
解法:简单模拟
- 时间复杂度:O( max(a_length, b_length) ),其中a_length、b_length分别表示两个字符串的长度。
Java代码
package com.company;
public class Main {
public static void main(String[] args) {
// String a = "1010";
// String b = "1011";
String a = "10";
String b = "11";
System.out.println(addBinary(a, b));
}
static public String addBinary(String a, String b) {
int a_length = a.length();
int b_length = b.length();
//预处理,对齐
if (a_length > b_length){
for (int i = 1; i <= (a_length-b_length); i++) {
b = "0" + b;
}
}else {
for (int i = 1; i <= (b_length-a_length); i++) {
a = "0" + a;
}
}
String result = "";
int ahead = 0;
//逐位相加
for (int i = Math.max(a_length, b_length) - 1; i >= 0; i--) {
int sum = (a.charAt(i) - '0') + (b.charAt(i) - '0') + ahead;
//结果只能是0、1、2、3
switch (sum){
case 0:
ahead = 0;
result = "0" + result;
break;
case 1:
ahead = 0;
result = "1" + result;
break;
case 2:
ahead = 1;
result = "0" + result;
//头部特殊情况处理
if (i == 0){
result = "1" + result;
}
break;
case 3:
ahead = 1;
result = "1" + result;
if (i == 0){
result = "1" + result;
}
break;
default:
System.out.println("error");
break;
}
}
return result;
}
}
结果分析
以上代码的执行结果:
执行时间 | 内存消耗 |
---|---|
4 ms | 35.9 MB |