leetcode67_二进制求和

一.  这题估计被我写复杂了,但是想法比较简单.

class Solution {
public:
	string addBinary(string a, string b) {
		stack<char> tmp;
		int i = a.length() - 1, j = b.length() - 1, cc = 0;
		//x和y代表当前位置上的值是多少.
        int x,y;
		//因为两个二进制字符串长度不一定相等.
		while (i >= 0 || j >= 0) {
			//如果短的字符串小于0了,
			//就在他的前面补0.
            if (i < 0) x = 0;
			//因为a和b是字符串,
			//所以需要减去'0'的ascii值得到数字.
            else x = a[i] - '0';
			if (j < 0) y = 0;
            else y = b[j] - '0';
			//如果加上进位大于等于2,也有可能是3.
			if (x + y + cc >= 2) {
                if(x + y + cc == 2){
					//压栈.
                    tmp.push('0');
				    cc = 1;
                }
                else{
                    tmp.push('1');
				    cc = 1;
                }
				
			}
			else {
				if (x + y + cc == 0) tmp.push('0');
				else tmp.push('1');
                cc = 0;
			}
			//同时更新i和j,去计算下一位的值.
			i--; j--;
		}
		//如果还有进位,则再push一个1.
		if (cc == 1) {
			tmp.push('1');
		}
		string res = "";
		//这里解释下为何用栈这种数据结构,
		//因为加法是从字符串尾部往前加,
		//赋值字符串时从头开始赋值,符合后进先出,
		//先进后出.
		while (!tmp.empty()) {
			res += tmp.top();
			tmp.pop();
		}
        return res;
	}
};

不过时间还是挺可以的..........

二. 参考一下大神的解法,对比一下.

作者:guanpengchn
链接:https://leetcode-cn.com/problems/add-binary/solution/hua-jie-suan-fa-67-er-jin-zhi-qiu-he-by-guanpengch/

思路
1.  整体思路是将两个字符串较短的用 0 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果。

2.  本题解中大致思路与上述一致,但由于字符串操作原因,不确定最后的结果是否会多出一位进位,所以会有 2 种处理方式:

3.  第一种,在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转.
4.  第二种,按照位置给结果字符赋值,最后如果有进位,则在前方进行字符串拼接添加进位.
时间复杂度:O(n)

class Solution {
public:
	string addBinary(string a, string b) {
		string ans;
		int cc = 0, i = a.size() - 1, j = b.size() - 1;
		while (i >= 0 || j >= 0)
		{
			int sum = cc;
			sum += (i >= 0 ? a[i--] - '0' : 0);
			sum += (j >= 0 ? b[j--] - '0' : 0);
			//利用to_string将数字转换成字符串.
			//利用stoi将字符串转换为数字.
			//类似十进制取个位十位,这里是二进制.
			ans += to_string(sum % 2);
			cc = sum / 2;
		}
		//判断最后需不需要补1.
		ans += (cc == 0 ? "" : "1");
		//反转字符串.
		reverse(ans.begin(), ans.end());
		return ans;
	}
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值