2015年6月25日星期四

Multiply Strings leetcode

Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
就是把字符所描述的数字相乘 直接乘法就数值太大可能溢出
建立一个m + n长度的数组 int[] tem99*99 也只是4位数 所以长度是两个长度的和
对于一个乘法 123* 45 结果的第0位是 num1的第0位与num2第0位 3* 5 % 10的结果 第1位是num1第一位和num2 的0位 2*5 + num1第0位和num2第一位4*3 的加和 再加上3*5 /10
对于num1 num2 遍历 每次i位和j位乘积都存储到 数组的第[i + j]上 
对于tem[i] tem[i] % 10 要贡献给结果的第i位 tem[i]/10 要贡献给i+ 1
最后可能tem的最高位有0 (10 * 10 只有3 位数 99 * 99 是四位数) 所以要把0 去除
时间O(m * n) 空间 O(m + n)

public class Solution {
    public String multiply(String num1, String num2) {
        if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0) {
            return "";
        }
        int[] list = new int[num1.length() + num2.length()];
        StringBuilder sb1 = new StringBuilder(num1).reverse();
        StringBuilder sb2 = new StringBuilder(num2).reverse();
        for (int i = 0; i < sb1.length(); i++) {
            for (int j = 0; j < sb2.length(); j++) {
                int m = sb1.charAt(i) - '0';
                int n = sb2.charAt(j) - '0';
                list[i + j] += m * n;
            }
        }
        int next = 0;
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < list.length; i++) {
            int tem = list[i] + next;
            next = tem / 10;
            res.insert(0, tem % 10);
        }
        while (res.length() > 1 && res.charAt(0) == '0') {//除去前边的0(由于建立tem的长度可能大于最后长度)

            res.deleteCharAt(0);
        }
        return res.toString();
    }
}

没有评论:

发表评论