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(); } }
没有评论:
发表评论