题意很简单,给两个string做乘法。无需考虑一些比如string中夹杂字母的case,但是不允许将input convert成数字再做乘法。影子题415。需要注意的几个地方是
思路就是正常的竖式做乘法,比如下面这个例子,就是123先乘以5,再用123和4相乘。
数字是从低位到高位做乘法的,结果集的数组是从右往左记录每一位的数字的
结果集的长度一定不大于(数字1的长度 + 数字2的长度)
竖式运算思想,以 num1 为 123,num2 为 456 为例分析
遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加。
int sum = product + res[p2]; 这一行为什么还要加入res[p2]是因为要应对这种情况,5 x 3得到15以后,还需要加上之前这个位置上的3,这一位上的数字才能正确。
作者:breezean
链接:https://leetcode-cn.com/problems/multiply-strings/solution/you-hua-ban-shu-shi-da-bai-994-by-breezean/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
JavaScript实现
1 /** 2 * @param {string} num1 3 * @param {string} num2 4 * @return {string} 5 */ 6 var multiply = function(num1, num2) { 7 let m = num1.length; 8 let n = num2.length; 9 let pos = new Array(m + n).fill(0); 10 11 for (let i = m - 1; i >= 0; i--) { 12 for (let j = n - 1; j >= 0; j--) { 13 let mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); 14 let p1 = i + j; 15 let p2 = i + j + 1; 16 let sum = mul + pos[p2]; 17 pos[p1] += Math.floor(sum / 10); 18 pos[p2] = sum % 10; 19 } 20 } 21 let res = ''; 22 for (let p of pos) { 23 if (!(res.length === 0 && p === 0)) { 24 res += p; 25 } 26 } 27 return res.length === 0 ? '0' : res; 28 };
Java实现
1 class Solution { 2 public String multiply(String num1, String num2) { 3 int m = num1.length(); 4 int n = num2.length(); 5 int[] res = new int[m + n]; 6 for (int i = m - 1; i >= 0; i--) { 7 for (int j = n - 1; j >= 0; j--) { 8 int product = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); 9 int p1 = i + j; 10 int p2 = i + j + 1; 11 int sum = product + res[p2]; 12 res[p1] += sum / 10; 13 res[p2] = sum % 10; 14 } 15 } 16 StringBuilder sb = new StringBuilder(); 17 for (int p : res) { 18 if (!(sb.length() == 0 && p == 0)) { 19 sb.append(p); 20 } 21 } 22 return sb.length() == 0 ? "0" : sb.toString(); 23 } 24 }