[leetcode每日一题2020/8/3]415. 字符串相加

题目来源于leetcode,解法和思路仅代表个人观点。传送门
难度:简单
用时:00:30:00(惭愧啊,写了好久)

题目

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

注意:

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

思路

大数相加的思路。

  1. 把两个字符串中公共的部分相加起来。(考虑进位carry)
  2. 把更长那个字符串,的其余部分,与进位carry,相加。(我的代码实现直接简单的循环相加了,carry!=0的时候就break,直接复制剩余部分)
  3. 加上进位。(如果进位不为0)

代码

class Solution {
    public String addStrings(String num1, String num2) {
        int i,j;
        int carry = 0;
        StringBuilder sum = new StringBuilder();
        for(i=num1.length()-1,j=num2.length()-1;i>=0&&j>=0;i--,j--){
            int s1 = num1.charAt(i) - '0' + num2.charAt(j) - '0' + carry;
            if(s1 >= 10){
                carry = 1;
            }else{
                carry = 0;
            }
            char s2 = (char) ('0' + s1%10);
            sum.append(s2);
        }
        

        //部分还有剩余
        String left = new String();
        if(i>=0){
            for(int p=i;p>=0;p--){
                int s1 = num1.charAt(p) - '0' + carry;
                if(s1 >= 10){
                    carry = 1;
                }else{
                    carry = 0;
                    left = num1.substring(0,p);
                    char s2 = (char) ('0' + s1%10);
                    sum.append(s2);
                    break;
                }
                char s2 = (char) ('0' + s1%10);
                sum.append(s2);
            }
        }else if(j>=0){
            for(int p=j;p>=0;p--){
                int s1 = num2.charAt(p) - '0' + carry;
                if(s1 >= 10){
                    carry = 1;
                }else{
                    carry = 0;
                    left = num2.substring(0,p);
                    char s2 = (char) ('0' + s1%10);
                    sum.append(s2);
                    break;
                }
                char s2 = (char) ('0' + s1%10);
                sum.append(s2);
            }
        }
        if(carry!=0){
            int s1 = carry;
            char s2 = (char)('0'+s1%10);
            sum.append(s2);
        }
        String ans = left + sum.reverse().toString();
        return ans;
    }
}

算法复杂度

时间复杂度:O(n),n为两个字符串中,最长的字符串的长度。
空间复杂度:O(n),n为两个字符串中,最长的字符串的长度。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LittleSeedling/article/details/107760907