笔试题80. LeetCode OJ (67)

Posted _从未止步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题80. LeetCode OJ (67)相关的知识,希望对你有一定的参考价值。

    Add Binary

    这个题的意思比较明了,计算两个字符串表示的二进制数的加法,可以参照示例看看,意思还是比清楚的。

我的思路是从右往左计算,将他们的和放到一个新的string中,其中最主要的是要处理进位,进位的处理需要一直处理,我分别举出相应的例子说明一下吧:

(1). "10"+"11"  这两个字符串一样长,所以最后加完以后,最后的还有一个进位需要处理。

(2). "1" + "111"这两个字符串长度不等,所以处理完一个字符串后还是需要单独处理另一个字符串中考虑进位

最后需要做的是逆置字符串,这样就得到了最终的结果

将进位的情况分析清楚的时候也就是你解答出此题的时候了,下面看看我的代码吧。

class Solution {
public:
	string addBinary(string a, string b)
	{	
		string ret = "";
		int len1 = a.size();
		int len2 = b.size();
		
		//空串
		if (len1 == 0 && len2 == 0)
			return ret;
		//一空,一非空
		if (len1 == 0) 
			return b;
		if (len2 == 0)
			return a;

        //记录进位信息,用于下一位的处理
		int carrybit = 0; 
		while (len1 > 0 && len2 > 0)
		{
			int bit = a[len1 - 1] - '0' + b[len2 - 1] - '0';
			if (carrybit == 1)
				bit += 1;
			
			//处理进位
			if (bit > 1)
			{
				carrybit = 1;
				bit %= 2;
				ret.push_back(bit + '0');
			}
			else
			{
				carrybit = 0;
				ret.push_back(bit + '0');
			}
			--len1;
			--len2;
		}
        
        //两个字符串很可能长度不等
		while (len1--)
		{
			int bit = a[len1] - '0';
			if (carrybit == 1)
				bit += 1;
				
			if (bit > 1)
			{
				carrybit = 1;
				bit %= 2;
			}
			else
			{
				carrybit = 0;
			}
			ret.push_back(bit + '0');
		}

		while (len2--)
		{
			int bit = b[len2] - '0';
			if (carrybit == 1)
				bit += 1;

			if (bit > 1)
			{
				carrybit = 1;
				bit %= 2;
			}
			else
			{
				carrybit = 0;
			}
				
			ret.push_back(bit + '0');
		}
		
		//按照上面的思路,最后的进位没有处理,需要单独处理
		if (len1 <= 0 && len2 <= 0)
		{
			if (carrybit == 1)
				ret.push_back('1');
		}
		
		//逆序ret,得到正确的结果
		int begin = 0;
		int end = ret.size()-1;
		while (begin < end)
			swap(ret[begin++], ret[end--]);


		return ret;
	}
};


以上是关于笔试题80. LeetCode OJ (67)的主要内容,如果未能解决你的问题,请参考以下文章

笔试题58. LeetCode OJ (45)

笔试题57. LeetCode OJ (44)

笔试题61. LeetCode OJ (48)

笔试题55. LeetCode OJ (42)

笔试题65. LeetCode OJ (52)

笔试题54. LeetCode OJ (41)