码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode] 16. Add Binary

时间:2014-11-25 00:01:55      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:io   ar   for   on   art   问题   bs   html   ad   

这个题目相对有点奇怪,题目如下:

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

For example,

a = "11"

b = "1"

Return "100".

可能是我思路的问题吧,我之前是在考虑先将string转成int或者double,然后将二进制转为十进制进行计算,最后再将这个十进制转为二进制再转为string返回。这个思路本来是没问题的。但是。。。。。在最后一个测试用例中,他给了一个超长的二进制串,其实也是,一个长度为100的string是很正常的,但是如果这个长度为100的string是一个二进制数,这个数字就已经挺可怕的了。我又不想强行引入big num,所以我写了一套string的二进制加法器。

题解如下:

class Solution {
public:
	string addBinary(string a, string b) 
	{
		reverse(a.begin(), a.end());
		reverse(b.begin(), b.end());

		int i = 0;
		int flag = 0;
		int lenA = a.length();
		int lenB = b.length();

		string c = "";
		while (i < lenA && i < lenB)
		{
			if (a[i] - ‘0‘ + b[i] - ‘0‘ + flag >= 2)
			{
				c += (a[i] - ‘0‘ + b[i] - ‘0‘ + flag) % 2 + ‘0‘;
				flag = 1;
			}
			else
			{
				c += a[i] - ‘0‘ + b[i] - ‘0‘ + flag + ‘0‘;
				flag = 0;
			}
			i++;
		}

		while (i < lenA)
		{
			if (a[i] - ‘0‘ + flag == 2)
			{
				flag = 1;
				c += "0";
			}
			else
			{
				c += a[i] - ‘0‘ + flag + ‘0‘;
				flag = 0;
			}
			i++;
		}

		while (i < lenB)
		{
			if (b[i] - ‘0‘ + flag == 2)
			{
				flag = 1;
				c += "0";
			}
			else
			{
				c += b[i] - ‘0‘ + flag + ‘0‘;
				flag = 0;
			}
			i++;
		}

		if (flag == 1)
		{
			c += "1";
		}

		reverse(c.begin(), c.end());

		return c;
	}
};

在这里用flag来表示前一位是否进位,这里要注意的就是有可能本身的两位加上进位的flag会出现3的情况,所以要考虑取余。其余的都很简单。

[leetcode] 16. Add Binary

标签:io   ar   for   on   art   问题   bs   html   ad   

原文地址:http://www.cnblogs.com/TinyBox/p/4119919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!