首页 / 算法 / 力扣算法题—067二进制求和
力扣算法题—067二进制求和
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了力扣算法题—067二进制求和,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2029字,纯文字阅读大概需要3分钟。
内容图文
![力扣算法题—067二进制求和](/upload/InfoBanner/zyjiaocheng/834/ffdf794dad684f3b9849ceda446db66b.jpg)
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 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 }
内容总结
以上是互联网集市为您收集整理的力扣算法题—067二进制求和全部内容,希望文章能够帮你解决力扣算法题—067二进制求和所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。