题目分析
这个题很明显就是对字符串的每一个位进行操作,思想也很简单啊,主要还是考验代码风格吧。
我们只需要从右到左每个位进行判断,然后填入新的字符串中,最后进行返回即可。
实现代码
class Solution {
public String addBinary(String a, String b) {
//先将字符串转化成字符数组,方便操作。
char[] str_a = a.toCharArray();
char[] str_b = b.toCharArray();
int i = str_a.length-1;
int j = str_b.length-1;
int count = 0;
//使用stringbuilder可以方便插入
StringBuilder sb = new StringBuilder();
//先对两者都有的部分进行加法操作。
while(i >= 0 && j >= 0){
//注意这里被坑了好久,获取当前位应该使用异或操作而不是或操作
//例如1+1+0,或操作就会变成1,异或会变成0
sb.insert(0, (str_a[i] - '0') ^ (str_b[j] - '0') ^ count);
//求进位的时候反而是使用或操作,因为这里a,b,count三者之中有两个为1,就代表当前位产生了进位。
count = ((str_a[i] - '0') & (str_b[j] - '0')) | ((str_a[i] - '0' & count) | (str_b[j] - '0' & count));
i--;
j--;
}
//处理较长字符串剩余的字符,同样要注意进位和加法之间的不同操作。
while(i >= 0){
sb.insert(0,(str_a[i] - '0') ^ count);
count = (str_a[i] & count);
i--;
}
while(j >= 0){
sb.insert(0,(str_b[j] - '0') ^ count);
count &= (str_b[j] - '0');
j--;
}
//防止还有最高位进位的出现,这里无论0,1都加入,因为下面还会进行前置0的去除,所以问题不大。
sb.insert(0,count);
int index = 0;
//注意这里只能遍历到倒数第二个位,因为测试用例中有0+0的情况,所以最少都要保留一个0.
while(index < sb.length()-1 && sb.charAt(index) == '0'){
index++;
}
//裁剪返回。
return sb.toString().substring(index);
}
}
上面这个写法是我自己写出来的,写的时间很长,并且代码的量也比较大,其实仔细看看我们这个代码里面还是有可以压缩的地方的,比如说我们三个while循环可以压缩成一个while循环,因为其实这里都是在干同样的事情。
优化后的代码如下
class Solution {
public String addBinary(String a, String b) {
int c = 0, i = a.length() - 1, j = b.length() - 1;
StringBuilder sb = new StringBuilder();
char[] charA = a.toCharArray();
char[] charB = b.toCharArray();
while (c > 0 || i >= 0 || j >= 0){
int valA = i >= 0 ? charA[i--] - '0' : 0;
int valB = j >= 0 ? charB[j--] - '0' : 0;
int sum = valA + valB + c;
c = sum >> 1;
sb.append(sum % 2);
}
return sb.reverse().toString();
}
}