* Matrix
* Time O(N * M) | Space O(N + M)
* https://leetcode.com/problems/multiply-strings/
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var multiply = (num1, num2) => {
const isZero = num1 === '0' || num2 === '0';
if (isZero) return '0';
const buffer = initBuffer(num1, num2);
multiplication(num1, num2, buffer);
removeLeadingZero(buffer);
return buffer.join('');
};
var initBuffer = (num1, num2) => {
const size = num1.length + num2.length;
return new Array(size).fill(0);
};
var multiplication = (num1, num2, buffer) => {
for (let i = num1.length - 1; 0 <= i; i--) {
for (let j = num2.length - 1; 0 <= j; j--) {
update(num1, i, num2, j, buffer);
}
}
};
var removeLeadingZero = (buffer) => {
const isLeadZero = buffer[0] === 0;
if (!isLeadZero) return;
buffer.shift();
};
var update = (num1, i, num2, j, buffer) => {
const curPos = i + j;
const prevPos = curPos + 1;
const carry = buffer[prevPos];
const product = getProduct(num1, i, num2, j);
const sum = carry + product;
const remainder = sum % 10;
const value = (sum - remainder) / 10;
buffer[prevPos] = remainder;
buffer[curPos] += value;
};
var getProduct = (num1, i, num2, j) => {
const [iNum, jNum] = [Number(num1[i]), Number(num2[j])];
return iNum * jNum;
};
* Matrix
* Time O(N * M) | Space O(N + M)
* https://leetcode.com/problems/multiply-strings/
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var multiply = (num1, num2) => {
const isZero = num1 === '0' || num2 === '0';
if (isZero) return '0';
const buffer = initBuffer(num1, num2);
multiplication(num1, num2, buffer);
removeLeadingZero(buffer);
return buffer.join('');
};
var initBuffer = (num1, num2) =>
new Array(num1.length + num2.length).fill(0);
var multiplication = (num1, num2, buffer) => {
[num1, num2] = [reverse(num1), reverse(num2)];
for (var i1 in num1) {
for (var i2 in num2) {
update(num1, i1, num2, i2, buffer);
}
}
buffer.reverse();
};
const reverse = (s) =>
s
.split('')
.reverse();
var update = (num1, i1, num2, i2, buffer) => {
const product = num1[i1] * num2[i2];
const index = Number(i1) + Number(i2);
buffer[index] += product;
buffer[index + 1] += Math.floor(buffer[index] / 10);
buffer[index] = buffer[index] % 10;
};
var removeLeadingZero = (buffer) => {
const isZero = buffer[0] === 0;
if (!isZero) return;
buffer.shift();
};