题目:
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
代码:
(解题思路主要是把它们转为相同长度的数组在计算,最后再判断一下是否要在最前面加1)
public String addBinary(String a, String b) {
//得到最长字符串个数
int max = Math.max(a.length(), b.length());
//将它们用数组存储,而且长度要一直
//例如:a="1011" b="11101"
//可转为a = [0,1,0,1,1] b=[1,1,1,0,1]
int[] aArray = new int[max];
int[] bArray = new int[max];
//判断一下哪个是长的字串,哪个是短的,然后转为数组
if (a.length() == b.length()) {
for (int i = max - 1; i >= 0; i--) {
int c = a.charAt(i) - 48;
int d = b.charAt(i) - 48;
aArray[i] = c;
bArray[i] = d;
}
} else if (a.length() > b.length()) {
for (int i = max - 1; i >= 0; i--) {
int c = a.charAt(i) - 48;
aArray[i] = c;
}
for (int i = 0; i <b.length(); i++) {
int d = b.charAt(i) - 48;
bArray[max-b.length()+i] = d;
}
} else {
for (int i = 0; i < a.length(); i++) {
int c = a.charAt(i) - 48;
aArray[max-a.length()+i] = c;
}
for (int i = max - 1; i >= 0; i--) {
int d = b.charAt(i) - 48;
bArray[i] = d;
}
}
//定义一个值,用来记录是否需要进前移位数字1
//例如当数字1和1相加的时候,需要往前加1,count便是记录
int count = 0;
//定义一个用来返回的字符串
StringBuilder result = new StringBuilder();
//从尾部开始相加
for (int i = max - 1; i >= 0; i--) {
//如果尾部相加和count,如果为0,则表示尾部都为0,count为0,所以直接记录0
if (aArray[i] + bArray[i] + count == 0) {
result.append(0);
count = 0;
} else if (aArray[i] + bArray[i] + count == 1) {
result.append(1);
count = 0;
} else if (aArray[i] + bArray[i] + count == 2) {
result.append(0);
count = 1;
} else {
result.append(1);
count = 1;
}
}
//因为上面只是遍历到最长字串串的长度
//如果当最前面的数为1,1时,相加为2,所以需要进1
//用于判断最后的是不是需要进1
if (count == 1) {
result.append(1);
return result.reverse().toString();
} else {
return result.reverse().toString();
}
}