67. 二进制求和 - 力扣(LeetCode)67. 二进制求和 - 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 提示: * 1 <= a.length, b.length <= 104 * a 和 b 仅由字符 '0' 或 '1' 组成 * 字符串如果不是 "0" ,就不含前导零https://leetcode.cn/problems/add-binary/
题目描述
给你两个二进制字符串a和b,以二进制字符串的形式返回它们的和。
示例: 输入:a = "11", b = "1" 输出:"100"
解题思路
二进制字符串相加和手工竖式加法思路一致:从最低位(字符串末尾)开始相加,保存进位。
- 使用双指针分别指向两个字符串尾部,模拟从低位向高位遍历;
- 每次把两个指针指向的数字加上进位
t; - 当前结果位 = 总和 % 2,新进位 = 总和 / 2;
- 循环结束后如果进位不为 0,需要额外补上最高进位;
- 我们得到的结果字符串是低位在前,最后反转一次得到正确顺序。
#include<string> #include<algorithm> class Solution { public: string addBinary(string a, string b) { int cur1=a.size()-1,cur2=b.size()-1; string ret; int t=0; while(cur1>=0||cur2>=0) { if(cur1>=0) t += a[cur1--] - '0'; if(cur2>=0) t += b[cur2--] - '0'; ret+='0' + (t % 2); t=t/2; } if(t==1) ret+='0' + t; reverse(ret.begin(), ret.end()); return ret; } };