• 43.字符串相乘


    2020-04-16
    字符串相乘

    给定两个以字符串形式表示的非负整数 num1 和 num2,

    返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

    题解:
    竖式乘法

    首先需要知道一点:两个数字相乘,最后的结果的长度必然小于两者的长度之和。

    竖式乘法就是采用的这种思想,相当于将结果整个采用数组的方式存储。如图:

    图中结果数组中的第 k 位在哪些情况下会被修改呢?

    现在我们假设 num1 当前的位置是 i ,num2 当前的位置是 j 。

    那么可以看出:i + j + 1 == k 时第 k 位会被直接修改,同时也可能会进位第 k - 1 位。

    具体情况如下:

    • 结果的 第 k 位 上的值就是(原来第 k 位的值 ret[k] + 增量 num1[i] * num2[j] )之和的余数。
    • 结果的 第 k - 1 位,可能会得到 ret[k] + num1[i] * num2[j] 运算产生的进位。
    /**
     * @param {string} num1
     * @param {string} num2
     * @return {string}
     */
    var multiply = function (num1, num2) {
      if (num1 === '0' || num2 === '0') return '0';
      // 两数相乘 结果最多位数为两个数的长度之和 res作为总结果的数组 最后一位是个位的值 倒数第二是十位 以此类推
      let res = new Array(num1.length + num2.length).fill(0); 
      // 从两个字符串的最后一位开始计算 最后一位计算的值可以确定 总结果 的个位的值 并且有可能进一位个十位
      for (let i = num1.length - 1; i >= 0; i--) { // 遍历字符串1
        let n1 = num1.charAt(i) - '0'; // 得到下标为i时的数值
        for (let j = num2.length - 1; j >= 0; j--) { // 遍历字符串2 
          let n2 = num2.charAt(j) - '0'; // 得到下标为j时的数值
          const sum = (res[i + j + 1] + n1 * n2); // 和为结果数组[i+j+1]项的值 + n1 * n2
          res[i + j + 1] = sum % 10; // 和取余数得到当前位的值
          res[i + j] += Math.floor(sum / 10); // 结果取整数为进一位的值
        }
      }
      for (let i = 0; i < res.length; i++) { // 去掉开头可能出现的0
        if (res[i] !== 0) {
          res = res.slice(i);
          return res.join('');
        }
      }
    };
  • 相关阅读:
    asp.net 网页标题、关键字、描述
    星级评分jQuery插件
    以jquery为基础的星星评分
    投票系统显示结果jQuery插件
    JAVASCRIPT模拟模式对话窗口
    Repeater 嵌套代码
    window服务程序安装卸载批处理文件
    c#window程序开发入门系列自学笔记
    jquery 模式对话框改进版
    php的正则表达式完全手册
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12713257.html
Copyright © 2020-2023  润新知