什么是额外的空间?是O(M)还是O(M * N)?

时间:2015-06-01 16:59:57

标签: string stringbuilder

Multiply Strings

假设两个数字表示为字符串,则将数字作为字符串返回乘法。

注意:数字可以任意大,也可以是非负数。

这是我的代码,我知道这不是解决这个问题的最佳方法,但我对空间复杂度有疑问,对于res,我知道长度将是M + N,但对于StringBuilder tmp,长度是M并且有N个循环,每个循环我创建一个长度为M的新StringBuilder。所以我感到困惑,请帮助我,谢谢你们,伙计们。

public class Solution {
    // extra space: O(M + N) maybe O(M * N),   354ms
    public String multiply(String num1, String num2) {
        int N = num1.length(), M = num2.length();
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < N; i++) {  // num1
            StringBuilder tmp = new StringBuilder(M);  // main confusion, the length is M, and N loops
            int carry = 0;
            if (num1.charAt(i) == '0') {  // if the current digit is 0, then continue
                res.append(0);
                continue;
            }
            for (int j = M - 1; j >= 0; j--) {  // num2
                carry += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                tmp.append(carry % 10);
                carry /= 10;
            }
            if (carry != 0) tmp.append(carry);  // case: 9 * 9
            tmp = tmp.reverse();
            res = res.append(0);
            // add all the products
            for (int k = res.length() - 1, l = tmp.length() - 1, add = 0; l >= 0 || add > 0; k--, l--) {
                add += ((k >= 0) ? res.charAt(k) - '0' : 0) + ((l >= 0) ? tmp.charAt(l) - '0': 0);
                if (k >= 0) 
                    res.setCharAt(k, (char) ('0' + (add % 10)));
                else
                    res.insert(0, add % 10);
                add /= 10;
            } 
        }
        int r = 0;
        for ( ; r < res.length() - 1 && res.charAt(r) == '0'; r++); // 0 * 0 
        return res.substring(r).toString();
    }
}

0 个答案:

没有答案