<LeetCode OJ> 67. Add Binary
2015-12-17 23:10
477 查看
67. Add Binary
Total Accepted: 69587 TotalSubmissions: 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'); //传给vector for (int i = 0; i<maxsize + 1; i++) { if (i<a.size()) numa[maxsize - i] = a[a.size() - 1 - i] - '0'; else numa[maxsize - i] = 0; } for (int i = 0; i<maxsize + 1; i++) { if (i<b.size()) numb[maxsize - i] = b[b.size() - 1 - i] - '0'; else numb[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
相关文章推荐
- 数据库链接字符串查询网站
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Flex字符串比较 还有Flex字符串操作
- 用批处理解决数学问题的代码第1/4页
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- C#插入法排序算法实例分析
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- Lua教程(七):数据结构详解
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法