【leetcode c++】67 Add Binary

Add Binary

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

 

For example,

a = "11"

b = "1"

Return "100".

           

二进制大家都知道,这题要求我们给定两个string形式的二进制数字,要我们做加法并返回一个string。

有看过我之前博客的看官还否记得21Merge Two Sorted Lists这题。我提到了加法,乘法,融合,合并,这一类的动词,使得参与运算的东西没有地位的差别,因此对我们算法的设计有影响。因此呢我们人为的设定主动被动关系。

加法,当然就设置加数和被加数。(融合、合并这类就设置插入与被插入)

这样就能因地制宜了。

怎么设置好呢。

以长的二进制数做被加数。因为,如果用短的做被加数,那么短的扫描完毕之后,还要把长的剩余的部分添加到短的中。我们要避免这样不必要的麻烦。


我们需要从后往前扫描字符串。

不管取谁做被加数,当短的那个数扫描完毕之后,还可能存在【进位】这个隐藏的加数,所以呢,如果还存在进位的话,还要继续往下算。 最后,如果被加数扫描完了(到最前面了),还存在进位,则需要插入一个‘1’。


前面做了plus one的题,进位的处理应该没问题了。

 

Leetcode的AcceptedSolutions Runtime Distribution(15-06-12)

 

源码:

#include <iostream>
#include <string>

using namespace std;

string addBinary(string a, string b);

int main(){

	string res = addBinary("110010", "10111");

	cout << " " << res;

	return 0;
}
string addBinary(string a, string b){
	if ("" == a) return b;
	if ("" == b) return a;

	string::iterator added;
	string::iterator adding;
	string::iterator iterBeginEd;
	string::iterator iterBeginIng;
	if (a.size() > b.size())
	{
		added = a.end();
		iterBeginEd = a.begin();
		adding = b.end();
		iterBeginIng = b.begin();
	}
	else
	{
		added = b.end();
		iterBeginEd = b.begin();
		adding = a.end();
		iterBeginIng = a.begin();
	}
	bool carry = false;
	while (iterBeginIng != adding)
	{
		adding--;
		added--;
		if (('0' == *adding && '1' == *added) || ('1' == *adding && '0' == *added))//'0' + '1' || '1' + '0'
		{
			if (carry)
			{
				*added = '0';
				carry = true;//冗余语句
			}
			else
			{
				*added = '1';
				carry = false;//冗余语句
			}
		}
		else if (('1' == *adding && '1' == *added))//'1' + '1'
		{
			if (carry) *added = '1';
			else *added = '0';
			carry = true;
		}
		else//'0' + '0'
		{
			if (carry) *added = '1';
			else *added = '0';
			carry = false;
		}
	}
	//到这里,短的数,也就是加数已经扫描完毕了。如果有进位的话,才需要继续扫描被加数。我这里怒偷懒,一个while直接扫完了,肯定是多做无意义的事情了。读者自行修改吧
	while (iterBeginEd != added)
	{
		added--;
		if ('0' == *added)
		{
			if (carry) *added = '1';
			else *added = '0';
			carry = false;
		}
		else
		{
			if (carry)
			{
				*added = '0';
				carry = true;//冗余语句
			}
			else
			{
				*added = '1';
				carry = false;//冗余语句
			}
		}
	}
	if (carry)
	{
		if (a.size() > b.size()) a.insert(a.begin(), '1');
		else b.insert(b.begin(), '1');
	}
	return a.size() > b.size() ? a : b ;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值