<LeetCode OJ> 67. Add Binary
来源:互联网 发布:gta5渣电脑神优化20桢 编辑:程序博客网 时间:2024/06/05 00:57
Total Accepted: 69587 Total Submissions: 266503 Difficulty: Easy
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
分析:
这里可能想复杂了:很朴素的思路,先将数据对齐转到vector中,进行一位一位的相加,然后获得进位结果,最后转换成string数据
class Solution {public:string addBinary(string a, string b){int maxsize = max(a.size(), b.size());vector<int> numa(maxsize + 1), numb(maxsize + 1);//为进位准备一个位置vector<int> vecans(maxsize + 1);string ans1(maxsize + 1, '0');//传给vectorfor (int i = 0; i<maxsize + 1; i++){if (i<a.size())numa[maxsize - i] = a[a.size() - 1 - i] - '0';elsenuma[maxsize - i] = 0;}for (int i = 0; i<maxsize + 1; i++){if (i<b.size())numb[maxsize - i] = b[b.size() - 1 - i] - '0';elsenumb[maxsize - i] = 0;}//一位一位的相加(高位在数组前面)for (int i = 0; i<maxsize + 1; i++)vecans[i] = numa[i] + numb[i];//进位,由低位向高位进位(逆向遍历)for (int i = maxsize; i>0; i--){if (vecans[i] >= 2){//vecans[i-1]是高位,vecans[i]是低位vecans[i - 1] += vecans[i] / 2;//高位获取进位vecans[i] = vecans[i] % 2;//低位去掉权}}for (int i = 0; i<maxsize + 1; i++)ans1[i] = vecans[i] + '0';//转换成字符串if (vecans[0] != 0)return ans1;else{string ans2(ans1, 1, maxsize);return ans2;}}};
学习别人家的代码和思路:
思路大概如下,先将两个字符串都翻转,这样就便于从后往前加,对于长度不够的,就当作0来计算。其他的步骤跟十进制的思路其实是一样的。
我们用十进制的思维来思考,比如167+95
1),先反转761,59,并且将计算结果放回长度较长者中
2),计算个位,即从下标0位置开始计算,(7+5)%10=2,进位值(7+5) / 10 = 1
3),计算十位,使长度较长的数的十位增1,6---7,(7+9)% 10=6,进位值(7+9)/10=1
4),计算百位,1---2,第二个数已经无数值,所以(2+0)%10=2,进位显然为0
结果:262(逆置结果)
// 时间复杂度O(n),空间复杂度O(1) class Solution { public: string addBinary(string a, string b) { string result; const size_t n = a.size() > b.size() ? a.size() : b.size(); //获得较大长度 reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); //逆置顺序 int carry = 0; //保存上一次的进位 for (size_t i = 0; i < n; i++) { const int ai = i < a.size() ? a[i] - '0' : 0; const int bi = i < b.size() ? b[i] - '0' : 0; //提取数准备相加, 越界则为0 const int val = (ai + bi + carry) % 2; //新数的当前位的值 carry = (ai + bi + carry) / 2; //进位值 result.insert(result.begin(), val + '0'); } if (carry == 1) //如果还有进位,则 result.insert(result.begin(), '1'); return result; } };
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50347947
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895 1 0
- <LeetCode OJ> 67. Add Binary
- LeetCode Oj 67. Add Binary
- LeetCode OJ:Add Binary
- LeetCode OJ - Add Binary
- LeetCode OJ Add Binary
- Leetcode OJ 67 Add Binary [Easy]
- [LeetCode]67.Add Binary
- LeetCode --- 67. Add Binary
- [Leetcode] 67. Add Binary
- [leetcode] 67.Add Binary
- 【leetcode】67. Add Binary
- [leetcode] 67.Add Binary
- [leetcode] 67. Add Binary
- 【Leetcode】67. Add Binary
- 67. Add Binary LeetCode
- 【LeetCode】67. Add Binary
- leetcode--67. Add Binary
- leetcode 67. Add Binary
- 双向链表
- 【leetcode题解】【再看一遍】【86】【M】Contains Duplicate III
- 二叉树Q
- 用树莓派制作智能小车
- 第十三周项目1-Prim算法的验证
- <LeetCode OJ> 67. Add Binary
- Android APK文件签名机制
- 数据结构(1)—— 排序算法汇总
- MongoDB整合Spring的操作
- android面试题总结
- 格式化字符串长度,超出部分显示省略号,区分汉字跟字母
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- apache+nginx 实现动静分离