首先使用最直观 最ugly的代码AC,根据失败的case,AC的代码如下:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int m = num1.size(),n = num2.size();
        int carry = 0;
        string res;

        while(m > 0 && n > 0)
        {
            int num = num1[m-1]-'0'+num2[n-1]-'0'+carry;
            carry = 0;
            if(num >= 10)
            {
                carry = 1;
                num = num%10;
            }
            res.insert(res.begin(),'0'+num);
            m--;
            n--;
        }
        
         while(n > 0)
        {
            int num = num2[n-1]-'0'+carry;
            carry = 0;
            if(num >= 10)
            {
                carry = 1;
                num = num%10;
            }
            res.insert(res.begin(),'0'+num);
            n--;
        }

        while(m > 0)
        {
            int num = num1[m-1]-'0'+carry;
            carry = 0;
            if(num >= 10)
            {
                carry = 1;
                num = num%10;
            }
            res.insert(res.begin(),'0'+num);
            m--;
        }

        if(carry)
            res.insert(res.begin(),'1');

        return res;
    }
};

执行结果:

执行结果:通过 显示详情
执行用时:16 ms, 在所有 C++ 提交中击败了22.54%的用户
内存消耗:6.5 MB, 在所有 C++ 提交中击败了96.73%的用户

尝试优化代码,毕竟上面的代码看着比较乱,上面的代码使用了三个循环,可以优化为一个循环:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int m = num1.size() - 1, n = num2.size() -1;
        int carry = 0;
        string res;
        
        while(m >= 0 || n >= 0 || carry)
        {
            int sum = carry;
            if(m >= 0) sum += num1[m--]-'0';
            if(n >= 0) sum += num2[n--]-'0';
            
            carry = sum/10;
            sum = sum %10;
            res += sum +'0';
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

上面值得注意的是我们先正序拼接,再进行逆序,执行时间会大幅度缩短。