【每日一题】415. 字符串相加

【每日一题】415. 字符串相加

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 都不包含任何前导零

解题思路

思路1:分别遍历字符串num1和num2得到对应的整数n1和n2,然后将n1和n2相加再转换为字符串,但是由于数据范围较大,故此种方法不可行。(不可行)

class Solution {
public:
    string addStrings(string num1, string num2) {
        long n1=0,n2=0;
        for(int i=0;i<num1.size();i++)
        {
            n1=n1*10+(num1[i]-'0');
        }
        for(int i=0;i<num2.size();i++)
        {
            n2=n2*10+(num2[i]-'0');
        }
        long res=n1+n2;
        return to_string(res);
    }
};

思路2:竖式减法。分别使用sum、cur、add表示当前位和,当前位,进位。首先遍历num1和num2公共部分,再遍历num1或者num2剩余部分,再处理add,此代码思路较为清晰,但是代码不简洁。(可行)

class Solution {
public:
    string addStrings(string num1, string num2) {
        int cur=0,sum=0,add=0;
        string res;
        //反转求和
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        int i;
        //共同部分
        for(i=0;i<num1.size()&&i<num2.size();i++)
        {
            sum=(num1[i]-'0')+(num2[i]-'0')+add;
            cur=sum%10;
            add=sum/10;
            res.push_back(cur+'0');
        }
        //num1多余部分
        for(;i<num1.size();i++)
        {
            sum=(num1[i]-'0')+add;
            cur=sum%10;
            add=sum/10;
            res.push_back(cur+'0');
        }
        //num2多余部分
        for(;i<num2.size();i++)
        {
            sum=(num2[i]-'0')+add;
            cur=sum%10;
            add=sum/10;
            res.push_back(cur+'0');
        }
        //最后还剩下add
        if(add)
            res.push_back(add+'0');
        reverse(res.begin(),res.end());
        return res;
    }
};

思路3:竖式加法,代码较为简洁。(可行)

class Solution {
public:
    string addStrings(string num1, string num2) {
        int sum=0,add=0;
        string res;
        int i=num1.size()-1,j=num2.size()-1;
        int x,y; 
        //逆序遍历 进入循环的条件 字符串1有数据 或者字符串2有数据 或者进位不为0 三合一
        while(i>=0||j>=0||add!=0)
        {
            //特判字符串1
            x=i>=0?num1[i]-'0':0;
            //特判字符串2
            y=j>=0?num2[j]-'0':0;
            sum=x+y+add;
            res.push_back(sum%10+'0');
            add=sum/10;
            i--;
            j--;
        }
        //翻转字符
        reverse(res.begin(),res.end());
        return res;
    }
};

总结:注意看数据范围!!

猜你喜欢

转载自blog.csdn.net/qq_43779149/article/details/131761269