自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

每日算法:字符串相乘

開發(fā) 前端 算法
給定兩個以字符串形式表示的非負(fù)整數(shù) num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。

[[421393]]

本文轉(zhuǎn)載自微信公眾號「三分鐘學(xué)前端」,作者sisterAn。轉(zhuǎn)載本文請聯(lián)系三分鐘學(xué)前端公眾號。

給定兩個以字符串形式表示的非負(fù)整數(shù) num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。

示例 1:

  1. 輸入: num1 = "2", num2 = "3" 
  2. 輸出: "6" 

示例 2:

  1. 輸入: num1 = "123", num2 = "456" 
  2. 輸出: "56088" 

說明:

  • num1 和 num2 的長度小于110。
  • num1 和 num2 只包含數(shù)字 0-9。
  • num1 和 num2 均不以零開頭,除非是數(shù)字 0 本身。
  • 不能使用任何標(biāo)準(zhǔn)庫的大數(shù)類型(比如 BigInteger)或直接將輸入轉(zhuǎn)換為整數(shù)來處理。

解法一:常規(guī)解法

從右往左遍歷乘數(shù),將乘數(shù)的每一位與被乘數(shù)相乘得到對應(yīng)的結(jié)果,再將每次得到的結(jié)果累加

另外,當(dāng)乘數(shù)的每一位與被乘數(shù)高位(非最低位)相乘的時候,注意低位補 '0'

  1. let multiply = function(num1, num2) { 
  2.     if (num1 === "0" || num2 === "0"return "0" 
  3.      
  4.     // 用于保存計算結(jié)果 
  5.     let res = "0" 
  6.          
  7.     // num2 逐位與 num1 相乘 
  8.     for (let i = num2.length - 1; i >= 0; i--) { 
  9.         let carry = 0 
  10.         // 保存 num2 第i位數(shù)字與 num1 相乘的結(jié)果 
  11.         let temp = '' 
  12.         // 補 0  
  13.         for (let j = 0; j < num2.length - 1 - i; j++) { 
  14.             temp+='0' 
  15.         } 
  16.         let n2 = num2.charAt(i) - '0' 
  17.              
  18.         // num2 的第 i 位數(shù)字 n2 與 num1 相乘 
  19.         for (let j = num1.length - 1; j >= 0 || carry != 0; j--) { 
  20.             let n1 = j < 0 ? 0 : num1.charAt(j) - '0' 
  21.             let product = (n1 * n2 + carry) % 10 
  22.             temp += product  
  23.             carry = Math.floor((n1 * n2 + carry) / 10) 
  24.         } 
  25.         // 將當(dāng)前結(jié)果與新計算的結(jié)果求和作為新的結(jié)果 
  26.         res = addStrings(res, Array.prototype.slice.call(temp).reverse().join("")) 
  27.     } 
  28.     return res 
  29.  
  30. let addStrings = function(num1, num2) { 
  31.     let a = num1.length, b = num2.length, result = '', tmp = 0 
  32.     while(a || b) { 
  33.         a ? tmp += +num1[--a] : '' 
  34.         b ? tmp +=  +num2[--b] : '' 
  35.          
  36.         result = tmp % 10 + result 
  37.         if(tmp > 9) tmp = 1 
  38.         else tmp = 0 
  39.     } 
  40.     if (tmp) result = 1 + result 
  41.     return result 

復(fù)雜度分析:

  • 時間復(fù)雜度:O(max(m*n , n * n))
  • 空間復(fù)雜度:O(m+n)

解法二:豎式相乘(優(yōu)化)

兩個數(shù)M和N相乘的結(jié)果可以由 M 乘上 N 的每一位數(shù)的和得到 ,如下圖所示:

  • 計算 num1 依次乘上 num2 的每一位的和
  • 把得到的所有和按對應(yīng)的位置累加在一起,就可以得到 num1 * num2 的結(jié)果
  1. let multiply = function(num1, num2) { 
  2.     if(num1 === '0' || num2 === '0'return "0" 
  3.      
  4.     // 用于保存計算結(jié)果 
  5.     let res = [] 
  6.      
  7.     // 從個位數(shù)開始逐位相乘 
  8.     for(let i = 0 ; i < num1.length; i++){ 
  9.         // num1 尾元素 
  10.         let tmp1 = +num1[num1.length-1-i] 
  11.          
  12.         for(let j = 0; j < num2.length; j++){ 
  13.             // num2尾元素 
  14.             let tmp2 = +num2[num2.length-1-j] 
  15.              
  16.             // 判斷結(jié)果集索引位置是否有值 
  17.             let pos = res[i+j] ? res[i+j]+tmp1*tmp2 : tmp1*tmp2 
  18.             // 賦值給當(dāng)前索引位置 
  19.             res[i+j] = pos%10 
  20.             // 是否進位 這樣簡化res去除不必要的"0" 
  21.             pos >=10 && (res[i+j+1]=res[i+j+1] ? res[i+j+1]+Math.floor(pos/10) : Math.floor(pos/10)); 
  22.         } 
  23.     } 
  24.     return res.reverse().join(""); 

復(fù)雜度分析:

 

  • 時間復(fù)雜度:O(m * n)
  • 空間復(fù)雜度:O(m + n)

 

責(zé)任編輯:武曉燕 來源: 三分鐘學(xué)前端
相關(guān)推薦

2021-09-10 08:31:54

翻轉(zhuǎn)字符串單詞

2021-08-26 05:08:25

相鄰重復(fù)項算法

2021-09-02 09:22:13

算法無重復(fù)字符

2016-12-30 13:32:24

字符串算法代碼

2013-05-06 10:54:08

字符串字符串匹配KMP算法

2023-12-15 10:27:01

暴力匹配算法Python字符串

2023-02-26 22:33:32

字符串排列算法

2021-11-12 09:44:03

字符串算法復(fù)雜度

2023-04-11 08:54:57

字符串匹配算法

2016-12-30 13:16:51

字符串算法代碼

2024-07-03 11:23:14

2013-05-06 10:49:21

Boyer-Moore算法字符串匹配

2009-08-11 10:26:49

C#算法C#字符串反轉(zhuǎn)

2016-12-30 13:37:50

字符串算法代碼

2021-12-21 11:39:01

數(shù)據(jù)結(jié)構(gòu)算法同構(gòu)字符串

2021-12-24 11:59:47

數(shù)據(jù)結(jié)構(gòu)算法字符串

2009-06-23 14:13:00

Java字符串

2024-04-01 08:41:39

字符串.NET

2021-03-08 08:23:24

Java字符串截取

2010-11-26 09:51:54

MySQL字符串
點贊
收藏

51CTO技術(shù)棧公眾號