LeetCode 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;
	}
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章