Leetcode刷题详解——字符串相加

1. 题目链接:415. 字符串相加

2. 题目描述:

给定两个字符串形式的非负整数 num1num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 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
  • num1num2 都只包含数字 0-9
  • num1num2 都不包含任何前导零

3. 解法:

3.1 算法思路:

请添加图片描述

  1. 首先,获取两个输入字符串的长度,分别存储在变量x1和x2中。
  2. 初始化一个空字符串s,用于存储结果。
  3. 初始化一个变量val,用于记录进位。
  4. 使用while循环进行以下操作,直到x1、x2都小于0且val等于0为止:
    • 判断x1是否大于等于0,如果是,则将num1[x1]减去字符’0’,得到y1的值;否则,将y1设为0。
    • 判断x2是否大于等于0,如果是,则将num2[x2]减去字符’0’,得到y2的值;否则,将y2设为0。
    • 将y1、y2和val相加,得到num的值。
    • 将num除以10取余数,加上字符’0’,得到当前位的数字,并将其添加到字符串s的末尾。
    • 将num除以10取整,更新val的值。
    • 将x1和x2的值减1,以便处理下一位数字。
  5. 使用reverse函数将字符串s反转,使其按照正确的顺序排列。
  6. 返回字符串s作为结果。

这个算法的思路是通过逐位相加的方式,将两个字符串表示的整数相加。在每次循环中,从字符串的末尾开始,依次取出每一位数字,并将其与进位值相加,得到当前位的结果。然后将结果除以10取余数,得到当前位的数字,并将其添加到结果字符串中。最后,将结果字符串反转,得到最终的相加结果。

3.2 C++算法代码:

class Solution {
public:
    // 定义一个函数addStrings,接收两个字符串参数num1和num2,返回一个字符串
    string addStrings(string num1, string num2) {
        // 获取num1和num2的长度减1,分别赋值给x1和x2
        int x1=num1.length()-1;
        int x2=num2.length()-1;
        // 定义一个空字符串s,用于存储结果
        string s="";
        // 定义一个变量val,初始值为0,用于记录进位
        int val=0;
        // 当x1大于等于0、x2大于等于0或val不等于0时,执行循环
        while(x1>=0||x2>=0||val!=0)
        {
            // 如果x1大于等于0,则将num1[x1]减去字符'0'的值赋给y1;否则,将y1设为0
            int y1=x1>=0?num1[x1]-'0':0;
            // 如果x2大于等于0,则将num2[x2]减去字符'0'的值赋给y2;否则,将y2设为0
            int y2=x2>=0?num2[x2]-'0':0;
            // 将y1、y2和val相加,得到当前位的结果
            int num=y1+y2+val;
            // 将当前位的结果除以10取余数,加上字符'0',然后添加到字符串s的末尾
            s.push_back(num%10+'0');
            // 将当前位的结果除以10取整,赋值给val
            val=num/10;
            // x1和x2都减1,以便处理下一位数字
            x1--;
            x2--;
        }
        // 将字符串s反转,使其按照正确的顺序排列
        reverse(s.begin(),s.end());
        // 返回字符串s作为结果
        return s;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值