【LeetCode-字符串】字符串相加

题目描述

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

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

题目链接: https://leetcode-cn.com/problems/add-strings/

思路1

模拟人做加法。首先在短的字符串前面补零,然后从后往前加。代码如下:

class Solution {
public:
    string addStrings(string num1, string num2) {
        if(num1.empty()) return num2;
        if(num2.empty()) return num1;

        int len1 = num1.length();
        int len2 = num2.length();
        int len = max(len1, len2); 
        if(len1>len2){  // 较短的字符串前面补0
            int delta = len1-len2;
            while(delta>0){
                num2 = "0"+num2;
                delta--;
            }
        }else if(len2>len1){
            int delta = len2-len1;
            while(delta>0){
                num1 = "0"+num1;
                delta--;
            }
        }

        string ans = "";
        int carry = 0;
        for(int i=len-1; i>=0; i--){
            int s = (num1[i]-'0')+(num2[i]-'0')+carry;
            ans = to_string(s%10) + ans;
            carry = s/10;
        }
        if(carry!=0){
            ans = "1"+ans;
        }
        return ans;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度: O(n)
    ans是额外的字符串,所占空间随着输入字符串长度的增加线性增长。

思路1改进
思路1首先需要在较短的字符串前面补0,然后再相加。可以用使用类似于链表相加的方法,使用两个指针分别指向两个字符串的末尾,然后逐渐往前移动,这样避免了补零的操作。代码如下:

class Solution {
public:
    string addStrings(string num1, string num2) {
        if(num1.empty()) return num2;
        if(num2.empty()) return num1;

        int l1 = num1.length()-1;
        int l2 = num2.length()-1;
        int carry = 0;
        string ans = "";
        while(l1>=0 || l2>=0){
            int x = l1>=0? (num1[l1]-'0'):0;
            int y = l2>=0? (num2[l2]-'0'):0;
            int s = x+y+carry;
            ans = to_string(s%10) + ans;
            carry = s/10;
            if(l1>=0) l1--;
            if(l2>=0) l2--;
        }
        if(carry!=0){
            ans = "1"+ans;
        }
        return ans;
    }
};

时间空间复杂度和改进前一样。

posted @ 2020-04-12 11:36  Flix  阅读(822)  评论(0编辑  收藏  举报