力扣刷题日记

这篇博客介绍了如何利用双指针法解决二进制字符串加法和一般字符串整数加法的问题,提供了C++代码实现。通过从字符串末尾开始逐位相加并处理进位,最终得到结果并反转输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

力扣刷题日记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;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值