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

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

[[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倫理の夜明け

ブログ    
ブログ    
ブログ    

推薦する

探索的データ分析: 人工知能と機械学習の有効性を判断するための第一歩

データ品質の低さは、人工知能 (AI) および機械学習 (ML) テクノロジの実際のパフォーマンスを...

30% のトークンで SOTA パフォーマンスを達成、Huawei Noah 軽量ターゲット検出器 Focus-DETR が効率を 2 倍に

現在、DETR モデルはターゲット検出の主流のパラダイムとなっています。しかし、DETRアルゴリズム...

データサイエンスと機械学習のためのトップ 16 プラットフォーム

調査会社ガートナーは、データ サイエンスおよび機械学習プラットフォームを「さまざまなデータ サイエン...

人工知能の急速な発展により、どのようなビジネス分野に浸透しているのでしょうか?テレマーケティングの将来はどうなるのでしょうか?

最近、人工知能の開発はますます激しくなってきています。ますます多くの新製品が私たちの生活に入ってきて...

...

ブロックチェーン投資の10大リスクポイント。これらを理解していないなら投資しないでください!

「ブロックチェーン」という言葉は、間違いなく過去1年間で最もホットな投資概念です。ビットコインなど...

ニューラル ネットワークの BP アルゴリズムが発明されるまでになぜ長い時間がかかったのでしょうか?

ローズブラットは 1950 年代にパーセプトロンを提案し、多層ニューラル ネットワークの BP アル...

ビッグデータと人工知能の関係、総合的な分析

ビッグデータはクラウドコンピューティングを採用PaaS レイヤーの複雑な汎用アプリケーションは、ビッ...

人工知能 VS 人間: 私たちは本当にいつも負け続けるのでしょうか?

ディープ・ブルー・コンピュータシステムがチェスチャンピオンのガルリ・カスパロフを華々しく破ってから2...

Google Gemini は Baidu を「騙し取っている」が、その背後にいる本当の犯人は誰なのか?

ノア著制作:51CTO テクノロジースタック(WeChat ID:blog)かつて AI の王者だっ...

機械学習は音楽界を征服するのに役立ち、あなたは次のヴィンセント・ファングになるでしょう

私はアークティック・モンキーズが大好きですが、彼らはもう何年も新しいシングルをリリースしていません。...

間違い:2017 年に人工知能分野で何が起こったか

今年、AIプロジェクトのAlphaGoとLibratusが、それぞれ人間の最強の囲碁プレイヤーとポー...

...

ビッグデータはスマートな警察活動の基盤であり、AIは包括的な分析と判断の原動力である

都市化と経済発展の加速に伴い、我が国の社会保障を構成する要素が拡大し、公安機関の警察活動に大きな圧力...

...