🌕🌗 43. 字符串相乘

吞佛童子2022年10月10日
  • algorithm
  • String
大约 1 分钟

🌕🌗 43. 字符串相乘

难度: 🌕🌗

问题描述

img_3.png


解法

class Solution {
    public String multiply(String num1, String num2) {
        // 思路:
        // 根据乘法计算步骤,进行表达
        int m = num1.length();
        int n = num2.length();
        // 特殊情况特判
        if(m == 1 && num1.equals("0")) {
            return "0";
        }
        if(n == 1 && num2.equals("0")) {
            return "0";
        }
        int[] array = new int[m + n]; // 结果的最大位数不超过这么多
        for(int j = n - 1; j >= 0; j --) {
            int base = j; // 当轮的基地址
            int c = 0; // 进位
            for(int i = m - 1; i >= 0; i --) {
                int offset = i + 1; // 当轮的偏移量
                // 当轮的 num1 每一位均需要与 num2[j] 相乘,从低位开始依次相乘
                int a = num1.charAt(i) - '0';
                int b = num2.charAt(j) - '0';
                int mul = a * b + c;
                mul += array[base + offset]; // 加上前面几轮在该位产生的结果
                // System.out.println(base + ":" + offset + "  " + mul);
                c = mul / 10; // 新的进位
                mul = mul % 10;
                array[base + offset] = mul;
                array[base + offset - 1] += c; // 前面一位加上当前的进位
                c = 0;
                // System.out.println(base + "  " + Arrays.toString(array));
            }
            array[base] += c;
        }
        // System.out.println(Arrays.toString(array));
        // 从后往前遍历数组,得到 res
        StringBuilder sb = new StringBuilder();
        for(int i = m + n - 1; i >= 0; i --) {
            if(array[i] < 10) {
                sb.append(array[i]);
            } else {
                array[i - 1] += array[i] / 10;
                sb.append(array[i] % 10);
            }
        }
        String res = sb.reverse().toString();
        // 除去可能存在的前导 0
        for(int i = 0; i < m + n; i ++) {
            if(res.charAt(i) != '0') {
                return res.substring(i, m + n);
            }
        }
        return res;
    }
}

输出

img_2.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou