<LeetCode OJ> 67. Add Binary

来源:互联网 发布:gta5渣电脑神优化20桢 编辑:程序博客网 时间:2024/06/05 00:57

67. Add Binary

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