二进制加法
题目描述:给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1 和 0。
看到题目描述之后,第一反应就是按照日常十进制加法来模拟二进制加法,也就没有多想,直接暴力计算。
解法
由于是二进制加法,只涉及 0 和 ;同时也和十进制加法一样,需要进位标志。为了方便计算,用0补齐a或b,使a b长度相等。话不多说,直接上代码。
public static String addBinary(String a, String b) {
int aLength = a.length(), bLength = b.length();
StringBuilder stringBuilder = new StringBuilder();
// 用0补齐a或b,使a b长度相等
if (aLength > bLength) {
stringBuilder.append("0".repeat(aLength - bLength));
b = stringBuilder.append(b).toString();
} else {
stringBuilder.append("0".repeat(bLength - aLength));
a = stringBuilder.append(a).toString();
}
char[] aChars = a.toCharArray();
char[] bChars = b.toCharArray();
int[] cChars = new int[aChars.length];
int jin = 0;
for (int i = aChars.length - 1; i >= 0; i--) {
// 这里需要注意char 和 int 换算
int sum = (aChars[i] == '0' ? 0 : 1) + (bChars[i] == '0' ? 0 : 1) + jin;
jin = sum >= 2 ? 1 : 0;
// 这里直接采用模运算获取
cChars[i] = sum % 2;
}
StringBuilder builder = new StringBuilder();
for (int item : cChars){
builder.append(item);
}
String result = builder.toString();
StringBuilder builder1 = new StringBuilder();
// 如果最后的进位是1 ,则高位需要补1
if(jin == 1){
result = builder1.append(1).append(result).toString();
}
return result;
}
上述代码就是按照十进制加法的思路来实现二进制加法,但是比较繁琐,对上述代码稍加改进。优化之后代码如下:
public static String addBinary(String a, String b) {
int aLength = a.length(), bLength = b.length();
StringBuilder stringBuilder = new StringBuilder();
// 用0补齐a或b,使a b长度相等
if (aLength > bLength) {
stringBuilder.append("0".repeat(aLength - bLength));
b = stringBuilder.append(b).toString();
} else {
stringBuilder.append("0".repeat(bLength - aLength));
a = stringBuilder.append(a).toString();
}
StringBuilder sb = new StringBuilder();
int jin = 0;
for (int i = a.length() - 1; i >= 0; i--) {
// 这里需要注意char 和 int 换算
int sum = (a.charAt(i) == '0' ? 0 : 1) + (b.charAt(i) == '0' ? 0 : 1) + jin;
jin = sum / 2;
// 这里直接采用模运算获取
sb.append(sum % 2);
}
// 如果最后的进位是1 ,则高位需要补1
if (jin == 1) {
sb.append(jin);
}
return sb.reverse().toString();
}