您的位置:首页 > 理论基础 > 数据结构算法

<LeetCode OJ> 67. Add Binary

2015-12-17 23:10 477 查看


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');

//传给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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息