字符串相加/相乘(大数相加、相乘)

字符串相加题目:
在这里插入图片描述
思路:
①取两个字符串末位字符 - '0’得到此位字符代表的实际值,相加并加上前一位的进位值
②用StringBuffer来存答案,最后记得反过来,因为append每次都加在当前StringBuffer的后面

代码:

class Solution {
    public String addStrings(String num1, String num2) {
        int len1 = num1.length() - 1;
        int len2 = num2.length() - 1;
        StringBuffer ans = new StringBuffer();
        int add = 0;
        while(len1 >= 0 || len2 >= 0 || add > 0){
            int a = len1 >= 0 ? num1.charAt(len1--) - '0' : 0;
            int b = len2 >= 0 ? num2.charAt(len2--) - '0' : 0;
            int temp = a + b + add;
            ans.append(temp%10);
            add = temp/10;
        }
        return ans.reverse().toString();

    }
}

时间复杂度: O(max(num1.length(),num2.length())

空间复杂度: O(1)

字符串相乘题目:
在这里插入图片描述
思路:
①结合大数相加的思想,按位乘后将结果相加

代码:

class Solution {
    public String addStrings(String num1, String num2) {
        int len1 = num1.length() - 1;
        int len2 = num2.length() - 1;
        StringBuffer ans = new StringBuffer();
        int add = 0;
        while(len1 >= 0 || len2 >= 0 || add > 0){
            int a = len1 >= 0 ? num1.charAt(len1--) - '0' : 0;
            int b = len2 >= 0 ? num2.charAt(len2--) - '0' : 0;
            int temp = a + b + add;
            ans.append(temp%10);
            add = temp/10;
        }
        return ans.reverse().toString();
    }
    public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0")){
            return "0";
        }
        int len1 = num1.length() - 1;
        int len2 = num2.length() - 1;
        String ans = "0";
        int size = 0;
        for(int i = len1; i >= 0; i--){
            int temp = 0;
            int add1 = 0;
            StringBuffer tempAns = new StringBuffer();
            int j = len2;
            while ( j >= 0 || add1 > 0){
                int temp1 = ( i >= 0 ? num1.charAt(i) - '0' : 0) * (j >= 0 ? num2.charAt(j) - '0' : 0) + add1;
                temp = temp1 % 10;
                add1 = temp1 / 10;
                tempAns.append(temp);
                j--;
            }
            tempAns.reverse();
            for(int k = 0; k < size; k++){
                tempAns.append('0');
            }
            size++;
            ans = addStrings(ans, tempAns.toString());
        }
        return ans;
    }
}

时间复杂度: O(mn+n^2)

空间复杂度: O(1)
时间复杂度: O(mn+n^ 2),其中 m 和 nn 分别是 num1,num2的长度度。需要从右往左遍历num2的每一位,都需要和num1的每一位计算乘积,因此计算乘积的总次数是 mn。字符串相加操作共有 n 次,相加的字符串长度最长为 m+n,因此字符串相加的时间复杂度是 O(mn+n^2)
)。

空间复杂度:O(m+n),空间复杂度取决于存储中间状态的字符串,由于乘积的最大长度为 m+n,因此存储中间状态的字符串的长度不会超过 m+n。


版权声明:本文为weixin_40578464原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。