题目描述
给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a = "11", b = "1" 输出: "100" 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" 提示: 每个字符串仅由字符 '0' 或 '1' 组成。 1 <= a.length, b.length <= 10^4 字符串如果不是 "0" ,就都不含前导零。
方式一:
1. 将传来的 a, b 两个字符串转换成为字符数组
2. 选取较长的字符串存储和 -[ 只进行对于位上的相加操作,并不处理进位 ]
3. 进行变化(字符串是二进制数)-[ 处理进位 ]
4. 判断首部情况
有些不好意思,代码太长了,不够简洁。
代码
char[] char_a = a.toCharArray();
char[] char_b = b.toCharArray();
int len1 = a.length();
int len2 = b.length();
int flag = 0;
boolean preAdd = false;
if (len1 >= len2) {
flag = 1;
for (int i = 0; i < len2; i++) {
if (char_b[len2 - 1 - i] == '0') {
continue;
}
if (char_a[len1 - 1 - i] == '1') {
char_a[len1 - 1 - i] = '2';
if(len1 - 1 - i == 0){
preAdd = true;
}
continue;
}
char_a[len1 - 1 - i] = '1';
}
} else {
for (int i = 0; i < len1; i++) {
if (char_a[len1 - 1 - i] == '0') {
continue;
}
if (char_b[len2 - 1 - i] == '1') {
char_b[len2 - 1 - i] = '2';
if(len2 - 1 - i == 0){
preAdd = true;
}
continue;
}
char_b[len2 - 1 - i] = '1';
}
}
char[] find = flag == 1 ? char_a : char_b;
for (int i = find.length - 1; i >= 0; i--) {
if (find[i] == '2' || find[i] == '3') {
if(i == 0){
preAdd = true;
}
find[i] = find[i] == '2' ? '0' : '1';
if (i > 0) {
switch (find[i - 1]) {
case '0':
find[i - 1] = '1';
break;
case '1':
find[i - 1] = '2';
break;
case '2':
find[i - 1] = '3';
break;
}
}
}
}
StringBuilder builder = new StringBuilder();
if (preAdd) {
builder.append('1');
}
for (char c : find) {
builder.append(c);
}
return builder.toString();
执行结果
方式二
建立一个StringBulider 类型的对象来存储 二进制相加的和,一个 int 类的变量来判断进位情况,两个字符串的长度不一定相等,但字符串的尾部位数相同,所以我们从尾部开始进行处理。
处理方法:将字符串对应位置上的字符转换成为整型,然后根据整型的大小来进行 ans 数据的添加和 add 变量的修改。
Ps: 注意 字符串长度不一;add变量在循环结束可能等于 1,会产生进位。
代码
/* 存储二进制和 */
StringBuilder ans = new StringBuilder();
/* 处理进位情况 */
int add = 0;
for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
int sum = add;
/* 获取a,b字符串相对应位数上和[转换成int 类型数据] */
sum += i >= 0 ? a.charAt(i) - '0' : 0;
sum += j >= 0 ? b.charAt(j) - '0' : 0;
/* 添加数据 */
ans.append(sum % 2);
/* 修改进位 */
add = sum / 2;
}
/* 判断是否有进位 */
ans.append(add == 1 ? add : "");
/* 在计算的时候从最后一位开始, 所以将StringBulider进行反转然后转换成为字符串返回 */
return ans.reverse().toString();
执行结果