LeetCode-字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

 

这是一种思路,暴力解法,但是好像会超时

class Solution {
public:
    string addStrings(string num1, string num2) {
        if(num1.empty() || num2.empty()) return !num1.empty() ?num1:num2;
        //存最后的返回值
        string res;
        
        int i = num1.size() - 1, j = num2.size() - 1, k = 0;
        //最后出来的时候一定是num1和num2都走到头,且最后一次也已经被加过
        while(i >= 0 || j >= 0 || k>= 0)
        {
            //将整形减去字符'0'就变成了字符
            //如果还没到第一位则继续相加,如果越过第一位则直接返回0
            k += (i >= 0)?num1[i--] - '0':0;
            k += (i >= 0)?num2[j--] - '0':0;
            //k%10可以得到个位的数字
            res.push_back((k%10 - '0'));
            //k/10可以得到进位
            k = k/10;    
        }
        //因为最终结果是从高位到地位存储的,所我们需要将字符串逆序一下
        reverse(res.begin(),res.end());
        return res;
    }
};

下面给出另一种写法

class Solution {
public:
        int char2int(char c)
        {
            return c-'0';
        }

    string addStrings(string num1, string num2) 
    {
        int l1 = num1.size(),l2 = num2.size();
        int len = l1 > l2 ? l1 : l2;
        //下面两个while循环是给两数中的较短者,在其前面补0
     while(l1 < len){
         num1 = '0' + num1;
         l1++;
     }
      while(l2 < len){
           num2 = '0' + num2;
         l2++;
       }
       int tmp = 0;
      string str = "";
       for(int i = len - 1;i >= 0;i--)
        {
         tmp += (char2int(num1[i]) +char2int(num2[i]));
         str = to_string(tmp%10) + str;
          tmp /= 10;
       }
       //是否最高位产生了进位
       if(tmp != 0)
           str = "1" + str;
       return str;
}
};

 

你可能感兴趣的:(LeetCode,数据结构)