43. 字符串相乘

133 阅读1分钟

题目

image.png

思路

  • 把竖式乘法进一步分解
  • 填当前位:res[i + j + 1]
  • 填进位:res[i + j]
  • num1和num2乘积的长度:m+n或者m+n-1,所以在res声明时直接声明M+N大小,证明:

image.png

71DE6067584E38D850430B62E66FB726.png

代码

class Solution {
    public String multiply(String num1, String num2) {
        int[] tmp = new int[num1.length() + num2.length()];
        //不用管竖式中谁大谁在上面
        for (int i = num1.length() - 1; i >= 0; i--) {
            for (int j = num2.length() - 1; j >= 0; j--) {
                int val1 = num1.charAt(i) - '0';
                int val2 = num2.charAt(j) - '0';
                int cur = tmp[i + j + 1] + val1 * val2; 
                tmp[i + j + 1] = cur % 10;//填放当前位
                tmp[i + j] += cur / 10; //填放进位,注意+=
                // res[i + j + 1] += val1 * val2 % 10;典型错误,这样会把进位漏掉
                // res[i + j] += val1 * val2 / 10;
            }
        }
        String res = "";
        
        for (int k = 0; k < tmp.length; k++) {
            // 去掉前导零
            if (res.length() == 0 && tmp[k] == 0) {
                continue;
            }
            res += tmp[k] + "";
        }
        return res.equals("") ? "0" : res; // 处理000000的情况
    
    }
}