Add Binary

来源:互联网 发布:centos ntp同步 编辑:程序博客网 时间:2024/04/30 03:03

Add Binary

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

/** 整理的提交代码 * 处理复杂度为O(max(n1,n2)) * 主要思路: * 1、先处理特殊情况,有其中一个为空,则将两位一个作为结果返回 * 2、对于二者都非空,在短的字符串前面补齐'0',使得两个长度相同 * 3、模拟手动计算,从字符串的尾部(二进制的低位)开始计算, *    循环内进行一位二进制相加,考虑进位。(此处可以改进)对于结果的最高位需要考虑进位。 * 4、在保存结果时,考虑到string的内部实现,为了提高效率先在尾部插入,最后一次反转 * 提交结果:  * (Judge Small)  * Run Status: Accepted!  * Program Runtime: 0 milli secs (基本在几毫秒) * Progress: 8/8 test cases passed.  * (Judge Large)  * Run Status: Accepted! * Program Runtime: 24 milli secs(基本稳定在二十多毫秒) * Progress: 294/294 test cases passed. */#include <string>#include <algorithm>#include <iostream>using namespace std;class Solution {public:string addBinary(string a, string b) {// Start typing your C/C++ solution below// DO NOT write int main() functionsize_t sizeA = a.size();size_t sizeB = b.size();// 特殊情况处理if (sizeA == 0)// a为空则返回b,包括a空且b非空和ab都为空的情况{return b;}else if (sizeB == 0)// a非空且b空{return a;}string c;char carry = '0';// 进位(字符)size_t size = max(sizeA, sizeB);// 选取长度// 不等则对齐if (sizeA > sizeB){b.insert(b.begin(), sizeA-sizeB, '0');}else if (sizeA < sizeB){a.insert(a.begin(), sizeB-sizeA, '0');}for (int i = size-1; i >= 0; i--){// 以下是一个二进制位的相加if (a[i] == '1' && b[i] == '1' && carry == '1'){c.push_back('1');//carry = '1';// no need}else if ((a[i] == '1' && b[i] == '1') || (a[i] == '1' && carry == '1') ||(b[i] == '1' && carry == '1')){c.push_back('0');carry = '1';}else if (a[i] == '0' && b[i] == '0' && carry == '0'){c.push_back('0');carry = '0';}else{c.push_back('1');carry = '0';}}if (carry == '1')// 最高位进位{c.push_back('1');}// 前面push_back是考虑到效率,不需要移动原来的元素,现在需要反转字符串reverse(c.begin(), c.end());return c;}};int main(){string a;string b;cout << "input string a: ";cin >> a;cout << "input string b: ";cin >> b;Solution s;string c = s.addBinary(a, b);cout << "add tow binary: " << a << " + " << b << " = " << c << endl; return 0;}

/** 整理的提交代码 * 处理复杂度为O(max(n1,n2)) * 主要思路: * 1、先处理特殊情况,有其中一个为空,则将两位一个作为结果返回 * 2、对于二者都非空,在短的字符串前面补齐'0',使得两个长度相同 * 3、模拟手动计算,从字符串的尾部(二进制的低位)开始计算, *    循环内进行一位二进制相加,考虑进位,对于结果的最高位需要考虑进位。 *    这里使用了map来直接查看一位二进制相加的结果(重构)。 * 4、在保存结果时,考虑到string的内部实现,为了提高效率先在尾部插入,最后一次反转 * 提交结果:  * (Judge Small)  * Run Status: Accepted!  * Program Runtime: 8 milli secs (基本在几毫秒) * Progress: 8/8 test cases passed.  * (Judge Large)  * Run Status: Accepted! * Program Runtime: 28 milli secs(基本稳定在二十多毫秒) * Progress: 294/294 test cases passed. */#include <string>#include <map>#include <algorithm>#include <iostream>using namespace std;class Solution {private:map<string, string> LookupMap;// 一位二进制以及进位相加结果public:Solution(){LookupMap["000"] = "00";LookupMap["001"] = "01";LookupMap["010"] = "01";LookupMap["011"] = "10";LookupMap["100"] = "01";LookupMap["101"] = "10";LookupMap["110"] = "10";LookupMap["111"] = "11";}string addBinary(string a, string b) {// Start typing your C/C++ solution below// DO NOT write int main() functionsize_t sizeA = a.size();size_t sizeB = b.size();// 特殊情况处理if (sizeA == 0)// a为空则返回b,包括a空且b非空和ab都为空的情况{return b;}else if (sizeB == 0)// a非空且b空{return a;}string c;char carry = '0';// 进位(字符)size_t size = max(sizeA, sizeB);// 选取长度// 不等则对齐if (sizeA > sizeB){b.insert(b.begin(), sizeA-sizeB, '0');}else if (sizeA < sizeB){a.insert(a.begin(), sizeB-sizeA, '0');}string str;for (int i = size-1; i >= 0; i--){// 以下是一个二进制位的相加str.clear();str += a[i];str += b[i];str += carry;c.push_back(LookupMap[str][1]);carry = LookupMap[str][0];}if (carry == '1')// 最高位进位{c.push_back('1');}// 前面push_back是考虑到效率,不需要移动原来的元素,现在需要反转字符串reverse(c.begin(), c.end());return c;}};

切记不可将二进制转换为整型做完整型加法后再转换回来,这样在二进制位数多会造成整型移除,会出错。
原创粉丝点击