您的位置:首页 > 其它

Leetcode - Add Binary

2016-04-17 22:55 381 查看

Question

Given two binary strings, return their sum (also a binary string).

For example,

a = “11”

b = “1”

Return “100”.

JavaCode

public String addBinary(String a, String b) {
//选择较长的String用于存储相加的结果
StringBuffer l = new StringBuffer();
String s = null;
if(a.length() > b.length()) {
l.append(a);
s = b;
}else {
l.append(b);
s = a;
}

boolean carry = false;//标记每次低位相加之后是否有进位
int diff = l.length() - s.length();
char ch1, ch2;

//计算两个二进制数各个对应数位之和
for(int i = l.length() - 1; i >= diff; --i) {
ch1 = l.charAt(i);
ch2 = s.charAt(i-diff);
if(ch1 == '1' && ch2 == '1') {
if (!carry) {//如果低位没有进位
carry = true;//则本次相加之后产生进位
l.setCharAt(i, '0');//保存当前二进制位相加的结果
}//如果低位有进位,则相加之后仍有进位(本逻辑分支无需任何操作)
}else if(ch1 == '0' && ch2 == '0'){
if (carry) {
carry = false;
l.setCharAt(i, '1');
}
}else {
if (carry) {
if(ch1 == '1')
l.setCharAt(i, '0');
}else if(ch1 == '0'){
l.setCharAt(i, '1');
}
}
}

//处理较长的加数中可能的连续进位
while(diff-- > 0){
if(carry) {
if(l.charAt(diff) == '1')
l.setCharAt(diff, '0');
else {
l.setCharAt(diff, '1');
carry = false;
break;//没有进位则结束继续进位的操作
}
}
}

//处理最高位上可能的进位并返回相加结果
if(carry)
return l.insert(0, '1').toString();
else
return l.toString();
}


说明

如果本题中输入的两个二进制字符串不太长(测试用例并未保证如此),则可以使用基本数据类型的包装类直接进行解析和转换,代码将很简洁:

public String addBinary(String a, String b) {
return Long.toBinaryString(Long.parseLong(a, 2) + Long.parseLong(b, 2));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode add binary