给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
解法一
class Solution {
public String addBinary(String a, String b) {
//转为二进制int后相加,然后toBinaryString输出二进制String
// return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2));
//结果被一大串字符串撑爆了
//使用双指针
char[] ch1 = a.toCharArray();
char[] ch2 = b.toCharArray();
StringBuilder result = new StringBuilder();
int i1 = ch1.length - 1;
int i2 = ch2.length - 1;
//carry代表进位
int carry = 0;
while (i1 >= 0 && i2 >= 0) {
//双1
if (ch1[i1] == '1' && ch2[i2] == '1') {
result.insert(0, carry);
//双1一定会进位
carry = 1;
}
//双0
else if (ch1[i1] == '0' && ch2[i2] == '0') {
result.insert(0, carry);
//双1一定不会进位
carry = 0;
}
//单1
else {
if (carry == 1) {
//carry不改变,继续进位
result.insert(0, 0);
} else {
result.insert(0, 1);
}
}
i1--;
i2--;
}
//ch1还没完
while (i1 >= 0) {
if (ch1[i1] == '1' && carry == 1) {
result.insert(0, 0);
carry = 1;
} else {
result.insert(0, ch1[i1] == '0' && carry == 0 ? 0 : 1);
carry = 0;
}
i1--;
}
//ch2还没完
while (i2 >= 0) {
if (ch2[i2] == '1' && carry == 1) {
result.insert(0, 0);
carry = 1;
} else {
result.insert(0, ch2[i2] == '0' && carry == 0 ? 0 : 1);
carry = 0;
}
i2--;
}
//如果都循环完后,还有进位
if (carry == 1) {
result.insert(0, 1);
}
return result.toString();
}
}
本来以为挺简单的,结果越写越多-_-||,看了题解。
解法二
解法二是画手大鹏
发布的题解,下面注解是评论区tomcat-yf
写的,写得很好,我直接复制过来了。
这种写法的思路:也是使用双指针,从后往前依次相加,如果其中一个长度为0,而另一个还没结束,那么就在结束那个上加0,一直到两个长度都为0,我没想到可以补0这茬,以后长短不一的可以补位,降低了编码的难度,学习了。
class Solution {
public String addBinary(String a, String b) {
StringBuilder ans = new StringBuilder();
int ca = 0; //是否进一位
for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
int sum = ca;
sum += (i >= 0 ? a.charAt(i) - '0' : 0); // 获取字符串a对应的某一位的值 当i<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
sum += (j >= 0 ? b.charAt(j) - '0' : 0);// 获取字符串a对应的某一位的值 当i<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
ans.append(sum % 2); //如果二者都为1 那么sum%2 应该刚好为0 否则为1
ca = sum / 2; //如果二者都为1 那么ca 应该刚好为1 否则为0
}
ans.append(ca == 1 ? ca : "");// 判断最后一次计算是否有进位 有则在最前面加上1 否则原样输出
return ans.reverse().toString();
}
}