原题
求两个字符串(字符串只包含1或0)的和,并以二进制形式输出:
如’01‘ + ’11‘ , 输出: ’100‘
解题思路
常规思路
先把字符串转换成十进制求和,之后把和转换成二进制,即为所求答案。
整数溢出
字符串如果过长,则会导致32位ini整数类型溢出。
优化后
如果字符串直接转成十进制会有整数溢出问题,那么我们可以分两步做。
- 把字符串转换成对应的二进制。 字符‘0’ - ‘1’,转化成0-1整数,只需要ch - ‘0’ 即可。因为‘0’的ascll码是48, 所以‘1’-‘0’的结果是整数1;
- 加法。从上面得到的字符串的二进制形式中最右边开始,两个字符串低位对低位相加,并记录进位。
具体代码如下:
代码
class Solution {
public String addBinary(String a, String b) {
int i = a.length() - 1;
int j = b.length() - 1;
int carry = 0; //进位
StringBuffer result = new StringBuffer();
//1。 把大小在'0' - '9'的字符转换成整数。即 ch - '0'
while (i >= 0 || j >= 0) {
int right = i >= 0 ? a.charAt(i--) - '0' : 0; //从最低位开始,向左扫描
int left = j >= 0 ? b.charAt(j--) - '0' : 0;
//二进制加法
int sum = right + left + carry;
carry = sum >= 2 ? 1 : 0;
result.append(sum % 2); // 2. sum 如果大于2, 那么sum为1
}
if(carry == 1) //3
result.append(carry);
return result.reverse().toString();
}
}
总结
本题考察二进制加法。通过本题您可以掌握整数溢出原因以及二进制从低到高的加法运算。