zoukankan      html  css  js  c++  java
  • 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('');
        }
      }
    };
  • 相关阅读:
    蓝牙学习(5) -- sockets
    蓝牙学习(4) -- L2CAP
    蓝牙学习(3) Linux kernel部分Bluetooth HCI分析
    蓝牙学习(2)USB Adapter
    蓝牙bluez学习(1) Stack Architecture
    Release Python Program as exe
    蓝牙stack bluez学习(1)Stack Architecture
    树莓派
    树莓派
    关于Reflow回流
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12713257.html
Copyright © 2011-2022 走看看