您的位置:首页 > 其它

LeetCode之二进制字符串相加

2016-07-13 10:24 756 查看
刚开始刷leetcode,第一道题是给两个二进制的字符串,求这两个二进制相加以后的和,输出当然也是二进制的格式了。以下是题目:

/**
* Given two binary strings, return their sum (also a binary string).
*
* For example, a = "11" b = "1" Return "100".
*/


解决这个问题,首先要自己模拟出二进制相加时的运算过程,首先计算的肯定是0号位,就是按照二进制中8,4,2,1这样排列时的最后一个。即首先计算a的最末位1和b的最末位1。1+1=2,在二进制计算中,应该表示为10,其中1是要进位的,即和两个二进制的1号位相加。

计算过程如下图(原谅我的灵魂画风。。):



具体代码如下:

public class AddBinary {
public static String addBinary(String a, String b) {
int i = a.length() - 1;
int j = b.length() - 1;
int da = 0;
int db = 0;
int adv = 0;
StringBuffer result = new StringBuffer();
while (i >= 0 && j >= 0) {
da = a.charAt(i--) == '0' ? 0 : 1;
db = b.charAt(j--) == '0' ? 0 : 1;
int d = da + db + adv;
result.append(d % 2 == 0 ? '0' : '1');
adv = d >> 1;
}
if (i >= 0) {
while (i >= 0) {
da = a.charAt(i--) == '0' ? 0 : 1;
int d = da + adv;
result.append(d % 2 == 0 ? '0' : '1');
adv = d >> 1;
}
} else if (j >= 0) {
while (j >= 0) {
db = b.charAt(j--) == '0' ? 0 : 1;
int d = db + adv;
result.append(d % 2 == 0 ? '0' : '1');
adv = d >> 1;
}
}
if (adv == 1) {
result.append('1');
}
return result.reverse().toString();
}
public static void main(String args[])
{
String consult=addBinary("11","1");
System.out.print("consult is "+consult);
}

}


首先获取二进制字符串的最后一位,相加,比如da=1,db=1,adv表示的是进位,所以刚开始adv初始为0,每次二进制位相加时就是da+db+adv,第一次运算过程就是d=1+1+0=2,但在实际算的过程中,结果的最后一位表示为0,所以代码中让取 d% 2 == 0 ? ‘0’ : ‘1’,此时进位为1,也就是d向右移一位,2向右移一位就是1啦,这样就得出了进位adv,到下次运算时,adv与二进制数一起相加。第二步是1号位相加,由于a有1号位,而b只有0号位,所以跳出while循环,在下一次计算中只有a的1号位和进位adv,如此循环往复即可。到最后,如果还有进位,代码处理的也很巧妙,直接在result结果后追加“1”。到最后把result转置即可。

题目很简单,讲的很啰嗦,其实只看代码就能看懂
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: