LeetCode 67 _ Add Binary 二进制相加 (Easy)

Descirption:

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

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"
 
 
 
Solution:

这道题要求输出用二进制加法得到的两数之和

 

二进制相加的算法和十进制其实是一样的,思路就是从末位开始相加,如果进位则该位归零(二进制归零,其他则获得余数),将该进位加入前方的数相加的过程中。

我们可以新建一个StringBuilder res,用来存放每一步获得的数字,将其附着在其后。注意由于需要从末位向前加,但向res中存放的顺序是从头至尾,因此在最后需要将得到的res再进行一次倒序,即可得到正确的答案。

 

在每次计算的时候,都需要考虑到是否有进位,创造一个变量flag存储进位,初始值为0,之后根据每一轮的加和进行修改。

在计算时,我们注意到输入的两数长度并不一定等长,在这里,我们可以考虑分步相加,创造一个变量sum,用于存该轮的相加之和,分别向sum中存储两个数目前的最末一位(如果其中一数已经到底终点则不需再加,只加另一个即可)以及上一轮的进位,将得到的sum%2,就是本轮该输出的值了;而进位则为sum/2。以此类推,直到将两数全部遍历完成。

在最后的时候,有一点容易遗留的是!!最后还可能有进位……所以最后还要检查进位是否为0,如果不为零则还要将该进位输出哦。

全部完成后将res倒序即可~

 

 
 
Code:
public String addBinary(String a, String b) {
    int na = a.length()-1, nb = b.length()-1;
	StringBuilder res = new StringBuilder();
	int flag = 0;//记录之前的进位
	while (na >= 0 || nb >= 0) {
		int sum = flag;
		if (na >= 0) {
			sum += a.charAt(na)-'0';
			na--;
		}
		if (nb >= 0) {
			sum += b.charAt(nb)-'0';
			nb--;
		}
		res.append(sum % 2);
		flag = sum / 2;
	}
	if (flag != 0) {
		res.append(flag);
	}
	return res.reverse().toString();
}

  

 

提交情况:

Runtime: 1 ms, faster than 99.93% of Java online submissions for Add Binary.
Memory Usage: 37 MB, less than 47.42% of Java online submissions for Add Binary.

posted @ 2019-04-07 19:27  Doris7  阅读(130)  评论(0编辑  收藏  举报