zoukankan      html  css  js  c++  java
  • 【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;
        }
    };
    

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

  • 相关阅读:
    053592
    053591
    053590
    053589
    053588
    053676
    C# WPF Border控件总结
    Android Studio 添加jar或aar依赖的两种方式
    javascript Date与string之间的转换
    C#:使用dsoframer.ocx控件实现内嵌office效果(详解)
  • 原文地址:https://www.cnblogs.com/flix/p/12684368.html
Copyright © 2011-2022 走看看