力扣刷题日记2---剑指 Offer II 002. 二进制加法
剑指 Offer II 002. 二进制加法
给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “10”
输出: “101”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
可以参考 力扣 415. 字符串相加 的做法,采用双指针法从尾部进行相加,C++代码如下:
class Solution {
public:
string addBinary(string a, string b) {
string ret = "";
int end1 = a.size() - 1, end2 = b.size() - 1, next = 0;
int value1 = 0, value2 = 0;
while(end1 >= 0 || end2 >= 0){
value1 = end1 >= 0 ? a[end1--] - '0' : 0;
value2 = end2 >= 0 ? b[end2--] - '0' : 0;
int midvalue = value1 + value2 + next;
next = midvalue / 2;
ret += (midvalue % 2) + '0';
}
if(next == 1)
ret += '1';
reverse(ret.begin(), ret.end());
return ret;
}
};
时间复杂度:O(max(a.size(), b.size())),以较长的字符串来计算;空间复杂度:O(1)。
力扣 415. 字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
提示:
1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
也可以理解为大数相加。因为要考虑进位,因此从后往前加更简单,双指针法,C++代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
// 从后往前加
int end1 = num1.size() - 1;
int end2 = num2.size() - 1;
int value1 = 0, value2 = 0;
int next = 0; //存放进位
string ret = ""; //存放最后的结果, 此时是倒序的,最后记得反转
while(end1 >= 0 || end2 >= 0){
if(end1 >= 0) // 防止字符串下标越界
value1 = num1[end1--] - '0';
else
value1 = 0;
if(end2 >= 0) // 防止字符串下标越界
value2 = num2[end2--] - '0';
else
value2 = 0;
int midvalue = value1 + value2 + next;
if(midvalue > 9){
next = 1;
midvalue -= 10;
}
else
next = 0; // 同位相加小于10, 对进位进行复位
ret += midvalue + '0';
}
if(next == 1)
ret += '1';
reverse(ret.begin(), ret.end());
return ret;
}
};
时间复杂度:O(max(num1.size(), num2.size())),以较长的字符串来计算;空间复杂度:O(1)。
看懂了上边的代码后,可以对代码进行简化,更简洁的代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
string ret = "";
int end1 = num1.size() - 1, end2 = num2.size() - 1, next = 0;
int value1 = 0, value2 = 0;
while(end1 >= 0 || end2 >= 0){
value1 = end1 >= 0 ? num1[end1--] - '0' : 0;
value2 = end2 >= 0 ? num2[end2--] - '0' : 0;
int midvalue = value1 + value2 + next;
next = midvalue / 10;
ret += (midvalue % 10) + '0';
}
if(next == 1)
ret += '1';
reverse(ret.begin(), ret.end());
return ret;
}
};