leetcode43 - Multiply Strings - medium

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.
Example 1:
Input: num1 = "2", num2 = "3"
Output: "6"
Example 2:
Input: num1 = "123", num2 = "456"
Output: "56088"
Note:
1. The length of both num1 and num2 is < 110.
2. Both num1 and num2 contain only digits 0-9.
3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

 

模拟法。
一个一个digit乘。注意一下乘出来的数字要加到哪一位即可。
1.开结果数组int[],数组长度为两个输入字符串的长之和。(答案最长不会超过这个和)
2.双重循环两个输入num的下标,从右往左扫(从低位开始乘)。对各为i,j下标的digit,乘积应处的位置高位在i+j, 低位在i+j+1。
3.算出的mul答案和result里原来在这两个index的答案加一加。然后把算出来的更新答案数位分离放回原处。
4.循环完毕把int[]转回string。注意删除前面的无效零,以及答案是0的时候也要还回去一个0.

细节:
1.乘法遍历digit要从string的后往前扫。
2.mul答案加上原来占位的数变成三位数也没关系,不用更新三个地方,更新两个地方让高位变成二位数最后也还是正确的,因为那个二位数下次被拿去加的时候会加对,处理最后一次最高位的乘法的时候会把所有二位数摊平的。

 

实现:

class Solution {
    public String multiply(String num1, String num2) {
        
        int[] ans = new int[num1.length() + num2.length()];
        // 遍历要从后往前扫啊!因为后才是低位
        for (int j = num2.length() - 1; j >= 0 ; j--) {
            for (int i = num1.length() - 1; i >= 0 ; i--) {
                int idxLow = i + j + 1;
                int idxHigh = i + j;
                int mul = (num2.charAt(j) - '0') * (num1.charAt(i) - '0');
                mul = mul + ans[idxHigh] * 10 + ans[idxLow];
                ans[idxHigh] = mul / 10;
                ans[idxLow] = mul % 10;
            }
        }
        
        StringBuilder sb = new StringBuilder();
        int i = 0;
        while (i < ans.length && ans[i] == 0) {
            i++;
        }
        while (i < ans.length) {
            sb.append(ans[i++]);
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }
}

 

posted @ 2018-09-17 14:44  jasminemzy  阅读(190)  评论(0编辑  收藏  举报