今日のアルゴリズム: 文字列の乗算

今日のアルゴリズム: 文字列の乗算

[[421393]]

この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載したもので、著者はsisterAnです。この記事を転載する場合は、「3分で学ぶフロントエンド」公式アカウントまでご連絡ください。

文字列として表される 2 つの非負整数 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 には 0 ~ 9 の数字のみが含まれます。
  • num1 も num2 も、数字 0 自体でない限り、ゼロで始まることはありません。
  • 標準ライブラリの大きな数値型 (BigInteger など) を使用したり、入力を直接整数に変換して処理したりすることはできません。

解決策1: 従来の解決策

乗数を右から左に走査し、乗数の各桁に被乗数を掛けて対応する結果を取得し、各回で得られた結果を累積します。

さらに、乗数の各ビットを被乗数の上位ビット(最下位ビットではない)に掛ける場合、下位ビットを「0」で埋めることに注意してください。

  1. 乗算 =関数(num1, num2) {
  2. if (num1 === "0" || num2 === "0" )戻り値  「0」  
  3.      
  4. // 計算結果を保存するために使用されます
  5. res = "0"とします 
  6.          
  7. // num2 は num1 とビットごとに乗算されます
  8. (i = num2.length - 1; i >= 0; i --)の場合{  
  9. キャリーを0にする
  10. // num2 の i 番目の桁を num1 で乗算した結果を保存します
  11. temp = ''とします 
  12. // 0 で埋める
  13. (j = 0; j < num2.length - 1 - i; j++)の場合{
  14. 温度+= '0'  
  15. }
  16. n2 = num2.charAt(i) - '0'とします。  
  17.              
  18. // num2 の i 番目の桁 n2 を num1 で乗算します
  19. ( j = num1.length - 1 とします; j >= 0 || carry != 0; j --) {  
  20. n1 = j < 0 ? 0 とします: num1.charAt(j) - '0'  
  21. 積を(n1 * n2 + 繰り上がり) % 10とする
  22. 温度+= 製品
  23. キャリー = Math.floor((n1 * n2 + キャリー) / 10)
  24. }
  25. //現在の結果と新しく計算された結果を合計して新しい結果とする
  26. res = addStrings(res, Array.prototype.slice.call( temp ).reverse(). join ( "" ))
  27. }
  28. 戻り
  29. }
  30.  
  31. addStrings =関数(num1, num2) {
  32. a = num1.length、b = num2.length、結果 = '' 、tmp = 0とします。
  33. while(a || b) {
  34. a ? tmp += +num1[ --a] : ''  
  35. b ? tmp += +num2[ --b] : ''  
  36.          
  37. 結果 = tmp % 10 + 結果
  38. tmp > 9 の場合 tmp = 1
  39. それ以外の場合、 tmp = 0
  40. }
  41. if (tmp) 結果 = 1 + 結果
  42. 結果を返す
  43. }

複雑性分析:

  • 時間計算量: O(max(m*n, n*n))
  • 空間計算量: O(m+n)

解決策2: 垂直乗算(最適化)

2 つの数値 M と N を乗算した結果は、次の図に示すように、M に N の各桁の合計を乗算することによって得られます。

  • num1 と num2 の各桁を掛け合わせた合計を計算します。
  • 対応する位置に従ってすべての合計を加算して、num1 * num2の結果を取得します。
  1. 乗算 =関数(num1, num2) {
  2. if(num1 === '0' || num2 === '0' )戻り値  「0」  
  3.      
  4. // 計算結果を保存するために使用されます
  5. res = [] とします
  6.      
  7. // 一の位から桁ごとに掛け算を始める
  8. ( i = 0 とします; i < num1.length; i++){
  9. // num1 末尾要素
  10. tmp1 = +num1[num1.length-1-i]とします。
  11.          
  12. (j = 0; j < num2.length; j++)の場合{
  13. // num2 末尾の要素
  14. tmp2 = +num2[num2.length-1-j]とします。
  15.              
  16. // 結果セットのインデックス位置に値があるかどうかを判定します
  17. pos = res[i+j] ? res[i+j]+tmp1*tmp2 とします: tmp1*tmp2
  18. // 現在のインデックス位置に値を割り当てる
  19. res[i+j] = 位置%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. res.reverse() を返します。join ( " " ) ;
  25. }

複雑性分析:

  • 時間計算量: O(m * n)
  • 空間計算量: O(m + n)

<<:  [技術的な詳細] 自動化プラットフォームの将来はどうなるのでしょうか? IBM Cloud Pak for Business Automationのコンポーネントを詳しく見る

>>:  AI倫理の夜明け

ブログ    
ブログ    
ブログ    

推薦する

MIT の驚くべき証明: 大きな言語モデルは「世界モデル」ですか?アンドリュー・ン氏の視点が再び確認され、LLMは空間と時間を理解できる

大きな言語モデルの中には世界モデルがあるのでしょうか? LLM には空間感覚がありますか?そして、こ...

PyGWalkerを使用して表形式のデータを視覚化および分析する

導入Jupyter Notebook に大量のデータがあり、それを分析して視覚化したいとします。 P...

見逃せない AIOps 実装の重要なポイントを解説するガイド

[[280530]] [51CTO.com クイック翻訳] システムの効率性と複雑さが増すにつれて、...

孫玄、Zhuanzhuan 社アーキテクチャアルゴリズム部門: AI によるマイクロサービスアーキテクチャ

[51CTO.com からのオリジナル記事] 2014 年頃から、マイクロサービス アーキテクチャの...

データマイニングの分野でトップ 10 の古典的なアルゴリズムの 1 つ - K-Means アルゴリズム (コード付きで非常に詳細)

k-means アルゴリズムは比較的単純です。 k-means アルゴリズムでは、クラスターはクラ...

人工知能は人間が理解できない量子実験を設計する

[[412058]]北京時間7月19日、量子物理学者のマリオ・クライン氏は、2016年初頭にウィーン...

お茶や水を出すロボットを購入する見込みはありますか?メタとニューヨーク大学がOK-Robotを開発

「xx、テレビ台のリモコンを取ってきて。」 家庭環境では、多くの家族が必然的にこの種の作業を命じられ...

...

ビデオ映像から間取り図を推測する新たなAI研究は目を見張るものがある

フロアプランは、空間を視覚化したり、ルートを計画したり、建物のデザインを伝えたりするのに役立ちます。...

...

3種類の動的ルーティングプロトコルアルゴリズムは、

ダイナミック ルーティング プロトコルには多くの種類があります。ここでは主に、RIP、OSPF、EI...

アルゴリズム博士の平均月収は4万元、データ可視化スキルは世界中で需要が高い

​​2020年現在、ほとんどの人にとって「ビッグデータ」という言葉に馴染みがないということはないでし...

人工知能がビデオ業界に力を与え、新しいエンターテインメント時代の変化が訪れる

[[264843]]人工知能の基本的な技術アプリケーションとして、コンピューター ビジョンは、その幅...

...