字符串相加(leetcode算法题)

各位老铁早上好,今天来分享一下我前两天做的leetcode的题目,我个人觉得这两道题目挺经典的,所以打算写这篇博客进行总结,希望各位老铁看完我这篇博客能有所收获。

字符串相加

题目链接

题目要求:你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

该题目要求意味着我们不能使用标准库进行大整数的运算,也不能直接把字符串直接转化为整数进行计算。

那么我们该如何解这道题呢?首先我们在小学都学过加法竖式的运算,下面我就结合该题目画一下加法运算的竖式运算图和分享一下该题目解题思路。
解题思路:在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

下面我们就来写一下代码吧(笔者直接就在oj上写代码了)

1.变量的定义

 //定义end1和end2分别指向字符串num1和num2的末尾
        int end1=num1.size()-1, end2=num2.size()-1;
        int carry=0;
        //存放数字相加的结果
        int sum=0;
        //存放相加后转成的字符串
        string addret;
         //用于存放字符串转化为数字
        int val1=0,val2=0;

2.字符串转化为数字:

//只要有一个位数>=0循环就不能停止
        while(end1>=0||end2>=0)
        {
            //对字符串num1进行转化成数字
            if(end1>=0) int val1=num1[end1--]-'0';
            else
            val1=0;//对位数小于另一个字符串的位数进行处理

            //对字符串num2进行转化成数字
            if(end2>=0) int val2=num2[end2--]-'0';
            else
            val2=0;
        }

3.对竖式的每一列式子进行相加:

 //对竖式的每一列式子进行相加
            sum=val1+val2+carry;

            //对相加得出得结果>=10进行处理
            if(sum>9)
            {
                carry=sum/10;
                sum%=10;
            }
            else
            {
                carry=0;
            }
  1. 把相加得出结果转化回字符串:
 //把相加得出结果转化回字符串
            addret+=(sum+'0');

5.处理carry==1的情况

//处理carry==1的情况
        if(carry==1)
        {
            addret+='1';
        }

6.把相加后的字符串结果进行逆置

//把相加后的字符串结果进行逆置
        reverse(addret.begin(),addret.end());

我们看一下该代码的运行结果
在这里插入图片描述
测试用例没问题了,我们再提交一下。(提交时间和击败多少用户不必在意,这个是leetcode特色,和你的网速有关)
在这里插入图片描述

代码总结:(oj平台上的代码)

class Solution 
{
public:
    string addStrings(string num1, string num2) 
    {
        //定义end1和end2分别指向字符串num1和num2的末尾
        int end1=num1.size()-1, end2=num2.size()-1;
        int carry=0;
        //存放数字相加的结果
        int sum=0;
        //存放相加后转成的字符串
        string addret;
        //用于存放字符串转化为数字
        int val1=0,val2=0;
        //只要有一个位数>=0循环就不能停止
        while(end1>=0||end2>=0)
        {
            //对字符串num1进行转化成数字
            if(end1>=0) val1=num1[end1--]-'0';
            else
            val1=0;

            //对字符串num2进行转化成数字
            if(end2>=0) val2=num2[end2--]-'0';
            else
            val2=0;

            //对竖式的每一列式子进行相加
            sum=val1+val2+carry;

            //对相加得出得结果>=10进行处理
            if(sum>9)
            {
                carry=1;
                sum-=10;
            }
            else
            {
                carry=0;
            }

            //把相加得出结果转化回字符串
            addret+=(sum+'0');
        }
        //处理carry==1的情况
        if(carry==1)
        {
            addret+='1';
        }

        //把相加后的字符串结果进行逆置
        reverse(addret.begin(),addret.end());
        return addret;
    }
};
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平平无奇。。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值