ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

力扣算法题—067二进制求和

2019-04-10 18:49:00  阅读:274  来源: 互联网

标签:p2 p1 string 067 二进制 res 力扣 int carry


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

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

示例 1:

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

示例 2:

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

 1 #include "_000库函数.h"
 2 
 3 //从末尾一位一位的相加
 4 class Solution {
 5 public:
 6     string addBinary(string a, string b) {
 7         if (a.empty())return b;
 8         if (b.empty())return a;
 9         int p1 = a.size() - 1,p2=b.size()-1;
10         string res = p1 > p2 ? a : b;//选用较长的二进制做基
11         int p = p1 > p2 ? p1 : p2;
12         int s = 0;//进位
13         while (p>=0) {
14             if (min(p1, p2) >= 0)//两数相加
15                 s = a[p1--] - '0' + b[p2--] - '0' + s;
16             else
17                 s = res[p] - '0' + s;//进位想加
18             
19             res[p--] = s % 2 + '0';
20             s = s / 2;
21         }
22         if (s) {//进位
23             a = "1";
24             res = a + res;
25         }
26         return res;
27     }
28 };
29 
30 //下面这种写法又巧妙又简洁,用了两个指针分别指向a和b的末尾,
31 //然后每次取出一个字符,转为数字,若无法取出字符则按0处理,
32 //然后定义进位carry,初始化为0,将三者加起来,对2取余即为当前位的数字,
33 //对2取商即为当前进位的值,记得最后还要判断下carry,如果为1的话,要
34 //在结果最前面加上一个1,参见代码如下:
35 class Solution {
36 public:
37     string addBinary(string a, string b) {
38         string res = "";
39         int m = a.size() - 1, n = b.size() - 1, carry = 0;
40         while (m >= 0 || n >= 0) {
41             int p = m >= 0 ? a[m--] - '0' : 0;
42             int q = n >= 0 ? b[n--] - '0' : 0;
43             int sum = p + q + carry;
44             res = to_string(sum % 2) + res;
45             carry = sum / 2;
46         }
47         return carry == 1 ? "1" + res : res;
48     }
49 };
50 void T067() {
51     Solution s;
52     string a, b;
53     a = "11";
54     b = "1";
55     cout << s.addBinary(a, b) << endl;
56     a = "1010";
57     b = "1011";
58     cout << s.addBinary(a, b) << endl;
59     a = "11010";
60     b = "";
61     cout << s.addBinary(a, b) << endl;
62 
63 
64 }

 

标签:p2,p1,string,067,二进制,res,力扣,int,carry
来源: https://www.cnblogs.com/zzw1024/p/10685283.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有