LeetCode(67):二进制求和

Easy!

题目描述:

给定两个二进制字符串,返回它们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

解题思路:

二进制数相加,并且保存在string中,要注意的是如何将string和int之间互相转换,并且每位相加时,会有进位的可能,会影响之后相加的结果。而且两个输入string的长度也可能会不同。这时我们需要新建一个string,它的长度是两个输入string中较大的那个,并且要把较短的那个输入string通过在开头加字符‘0’来补充为和较大的那个一样的长度。这时候我们逐个从两个string的末尾开始取出字符,然后转为数字,相加,如果大于等于2,则标记进位标志carry,并且给新string加入一个字符‘0’。

C++解法一:

 1 class Solution {
 2 public:
 3     string addBinary(string a, string b) {
 4         string res;
 5         int na = a.size();
 6         int nb = b.size();
 7         int n = max(na, nb);
 8         bool carry = false;
 9         if (na > nb) {
10             for (int i = 0; i < na - nb; ++i) b.insert(b.begin(), '0');
11         }
12         else if (na < nb) {
13             for (int i = 0; i < nb - na; ++i) a.insert(a.begin(), '0');
14         }
15         for (int i = n - 1; i >= 0; --i) {
16             int tmp = 0;
17             if (carry) tmp = (a[i] - '0') + (b[i] - '0') + 1;
18             else tmp = (a[i] - '0') + (b[i] - '0');
19             if (tmp == 0) {
20                 res.insert(res.begin(), '0');
21                 carry = false;
22             }
23             else if (tmp == 1) {
24                 res.insert(res.begin(), '1');
25                 carry = false;
26             }
27             else if (tmp == 2) {
28                 res.insert(res.begin(), '0');
29                 carry = true;
30             }
31             else if (tmp == 3) {
32                 res.insert(res.begin(), '1');
33                 carry = true;
34             }
35         }
36         if (carry) res.insert(res.begin(), '1');
37         return res;
38     }
39 };

下面这种写法既巧妙又简洁,用了两个指针分别指向a和b的末尾,然后每次取出一个字符,转为数字,若无法取出字符则按0处理,然后定义进位carry,初始化为0,将三者加起来,对2取余即为当前位的数字,对2取商即为当前进位的值,记得最后还要判断下carry,如果为1的话,要在结果最前面加上一个1。

C++解法二:

 1 class Solution {
 2 public:
 3     string addBinary(string a, string b) {
 4         string res = "";
 5         int m = a.size() - 1, n = b.size() - 1, carry = 0;
 6         while (m >= 0 || n >= 0) {
 7             int p = m >= 0 ? a[m--] - '0' : 0;
 8             int q = n >= 0 ? b[n--] - '0' : 0;
 9             int sum = p + q + carry;
10             res = to_string(sum % 2) + res;
11             carry = sum / 2;
12         }
13         return carry == 1 ? "1" + res : res;
14     }
15 };

猜你喜欢

转载自www.cnblogs.com/ariel-dreamland/p/9151374.html