JavaScript 面接でよくあるアルゴリズムの質問の詳細な説明

JavaScript 面接でよくあるアルゴリズムの質問の詳細な説明

[[185725]]

JavaScript での変数の昇格を説明する

いわゆるプロモーションは、その名前が示すように、JavaScript がすべての宣言を現在のスコープの先頭に昇格することを意味します。つまり、変数は宣言される前に使用できますが、JavaScript は宣言を先頭に移動しますが、実際の初期化プロセスは実行しません。

厳密な使用の役割を説明します。

use strict; 名前が示すように、JavaScript はいわゆる strict モードで実行されます。その主な利点の 1 つは、開発者が宣言されていない変数の使用を避けるように強制できることです。古いバージョンのブラウザまたは実行エンジンの場合、この命令は自動的に無視されます。

  1. //厳密モード
  2. 「厳密な使用」 ;
  3.  
  4. すべてをキャッチします();
  5. 関数catchThemAll() {
  6. x = 3.14; // エラーが発生します
  7. x * xを返します
  8. }

イベントバブリングとは何か、それを避ける方法を説明する

イベントバブリングとは、イベントが現在の要素をトリガーするだけでなく、ネストされた順序で親要素に渡すことを意味します。直感的に言えば、子要素のクリック イベントは、親要素のクリック イベント ハンドラーによってもキャプチャされます。イベント バブリングを回避するには、event.stopPropagation() または IE 9 以下の場合は event.cancelBubble を使用します。

== と === の違いは何ですか?

=== は厳密な比較とも呼ばれます。主な違いは、=== は値だけでなく、型と値の両方を比較することです。

  1. //比較演算子の
  2. 0 ==; // 
  3. 0 === false ; // 
  4.  
  5. 2 == '2' ; // 
  6. 2 === '2' ; // 

nullとundefinedの違いを説明する

JavaScript では、null は割り当て可能な値です。null に設定された変数は、値がないことを意味します。未定義とは、変数が宣言されているが、値が割り当てられていないことを意味します。

プロトタイプ継承と古典的継承の違いを説明する

クラス継承では、クラスは不変です。言語によって多重継承のサポートは異なります。一部の言語では、インターフェース、final、abstract の概念もサポートされています。プロトタイプの継承はより柔軟で、プロトタイプ自体は変更可能であり、オブジェクトは複数のプロトタイプから継承できます。

配列

整数配列の中で積が最大となる3つの数値を見つける

順序付けられていない整数の配列が与えられた場合、積が *** となる 3 つの数値を見つける必要があります。

  1. var 未ソート配列 = [-10, 7, 29, 30, 5, -10, -70];
  2.  
  3. computeProduct(未ソート配列); // 21000
  4.  
  5. 関数sortIntegers(a, b) {
  6. a - bを返します
  7. }
  8.  
  9. // 最大の積は(min1 * min2 * max1 || max1 * max2 * max3) のいずれかです
  10. 関数computeProduct(未ソート) {
  11. var sorted_array = unsorted.sort(sortIntegers)、
  12. 製品1 = 1、
  13. 積2 = 1、
  14. 配列n要素 = ソートされた配列の長さ - 1;
  15.  
  16. //ソートされた配列内の3つの最大の整数の取得します
  17. ( var x = array_n_element; x > array_n_element - 3; x --) {  
  18. product1 = product1 * ソートされた配列[x];
  19. }
  20. product2 = ソートされた配列[0] * ソートされた配列[1] * ソートされた配列[配列n要素];
  21.  
  22. (product1 > product2) の場合、product1を返します
  23.  
  24. 返品商品2
  25. };

連続した配列内の欠落した数字を見つける

上限と下限がわかっている、n 個の連続する数字 (n - 1 個) を含む順序付けられていない配列が与えられた場合、O(n) の計算量で欠落している数字を見つけます。

  1. //出力 関数8であるべきである
  2. var 整数の配列 = [2, 5, 1, 4, 9, 6, 3, 7];
  3. var 上限 = 9;
  4. var 下限 = 1;
  5.  
  6. findMissingNumber(整数の配列、上限、下限); //8
  7.  
  8. 関数findMissingNumber(整数の配列、上限、下限) {
  9.  
  10. // 配列を反復処理して合計求める 数字
  11. var 整数の合計 = 0;
  12. ( var i = 0; i < 整数配列の長さ; i++) {
  13. 整数の合計 += 整数の配列[i];
  14. }
  15.  
  16. // ガウス和の公式を使用して理論的な配列の合計を計算します
  17. // 式: [(N * (N + 1)) / 2] - [(M * (M - 1)) / 2];
  18. // N上限 M下限です
  19.  
  20. 上限合計 = (上限 * (上限 + 1)) / 2;
  21. 下限値の合計 = (下限値 * (下限値 - 1)) / 2;
  22.  
  23. 理論上の合計 = 上限の合計 - 下限の合計;
  24.  
  25. //
  26. (理論上の合計 - 整数の合計)を返す
  27. }

アレイ重複排除

順序付けられていない配列が与えられた場合、配列内の重複する数値を削除し、重複のない新しい配列を返す必要があります。

  1. // ES6 実装
  2. var 配列 = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
  3.  
  4. Array.from (新しいSet (配列)); // [1, 2, 3, 5, 9, 8]
  5.  
  6.  
  7. // ES5 実装
  8. var 配列 = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
  9.  
  10. uniqueArray(配列); // [1, 2, 3, 5, 9, 8]
  11.  
  12. 関数uniqueArray(配列) {
  13. var ハッシュマップ = {};
  14. varユニーク= [];
  15. ( var i = 0; i < 配列の長さ; i++) {
  16. //キーの場合 返品  null (一意)の場合、次のように評価されます  間違い
  17. if(!hashmap.hasOwnProperty([array[i]])) {
  18. ハッシュマップ[配列[i]] = 1;
  19. ユニーク.push(配列[i]);
  20. }
  21. }
  22. 戻る 個性的;
  23. }

配列内の要素間の差を計算する

順序付けられていない配列が与えられた場合、任意の 2 つの要素間の最大差を求めます。差の計算における小さい方の要素の添え字は、大きい方の要素の添え字よりも小さくなければならないことに注意してください。たとえば、配列 [7, 8, 4, 9, 9, 15, 3, 1, 10] の計算値は、15 の添字が 1 未満であるため、14 (15 - 1) ではなく 11 (15 - 4) になります。

  1. var 配列 = [7, 8, 4, 9, 9, 15, 3, 1, 10];
  2. // [7, 8, 4, 9, 9, 15, 3, 1, 10] は、 `4``15`基づいて `11`を返します
  3. // 注意: それ  `15``1`から`14`は得られません。15 が 1 の前に来るからです。
  4.  
  5. findLargestDifference(配列);
  6.  
  7. 関数findLargestDifference(配列) {
  8.  
  9. // 配列に要素が1つしかない場合は、直接-1を返します
  10.  
  11. 配列の長さが 1 未満の場合は-1 を返します
  12.  
  13. // current_min は現在の最小値を指します
  14.  
  15. var current_min = 配列[0];
  16. var 現在の最大差 = 0;
  17.    
  18. // 配列全体を走査して、現在の最大差を見つけます。最大差が見つかった場合は、current_max_difference を新しい値で上書きします。
  19. // また、現在の配列の最小値も追跡し、`将来最大値` - `それ以前の最小値`を保証します。
  20.  
  21. ( var i = 1; i < 配列の長さ; i++) {
  22. 配列[i] > 現在の最小値 && 配列[i] - 現在の最小値 > 現在の最大差) {
  23. 現在の最大差 = 配列[i] - 現在の最小値;
  24. }そうでない場合 (配列[i] <= current_min) {
  25. current_min = 配列[i];
  26. }
  27. }
  28.  
  29. // 負または0の場合  大きな違いはない
  30. (current_max_difference <= 0) の場合は-1 を返します
  31.  
  32. 現在の最大差を返します
  33. }

配列内の要素の積

順序付けられていない配列が与えられた場合、新しい配列出力を返す必要があります。ここで、output[i] は、インデックス i の要素を除く元の配列の要素の積です。複雑さは O(n) である必要があります。

  1. var firstArray = [2, 2, 4, 1];
  2. var secondArray = [0, 0, 0, 2];
  3. var thirdArray = [-2, -2, -3, 2];
  4.  
  5. productExceptSelf(firstArray); // [8, 8, 4, 16]
  6. productExceptSelf(secondArray); // [0, 0, 0, 0]
  7. productExceptSelf(thirdArray); // [12, 12, 8, -12]
  8.  
  9. 関数productExceptSelf(numArray) {
  10. var 製品 = 1;
  11. var size = numArray.length;
  12. var出力= [];
  13.  
  14. //から 最初の配列: [1, 2, 4, 16]
  15. //この場合最後の数字 すでに正しい位置ある私たちにはそれができる
  16. //次のステップ1掛けるだけです
  17. // このステップは基本的に製品を移動します インデックス  インデックス+ 1
  18. ( var x = 0; x <サイズ; x++) {
  19. 出力.push(product);
  20. 製品 = 製品 * numArray[x];
  21. }
  22.  
  23. //後ろから現在の 出力要素(製品を表す)
  24. // 指数右側掛け合わます  要素
  25. var 製品 = 1;
  26. (var i = size - 1; i > -1; i --) {  
  27. 出力[i] =出力[i] * 製品;
  28. 製品 = 製品 * numArray[i];
  29. }
  30.  
  31. 戻る 出力;
  32. }

配列の交差

2 つの配列が与えられた場合、2 つの配列の交差部分を見つける必要があります。交差部分の要素は一意である必要があることに注意してください。

  1. var firstArray = [2, 2, 4, 1];
  2. var secondArray = [1, 2, 0, 2];
  3.  
  4. 交差点(最初の配列、2番目の配列); // [2, 1]
  5.  
  6. 関数の交差(最初の配列、2番目の配列) {
  7. // ここでのロジック   firstArray要素キーとしてハッシュマップを作成します
  8. //その後、ハッシュマップのO(1)検索時間を使用できます  ハッシュ内に要素が存在するかどうかを確認する
  9. // 存在する場合は、その要素を新しい配列追加します
  10.  
  11. var ハッシュマップ = {};
  12. var 交差点配列 = [];
  13.  
  14. firstArray.forEach(関数(要素) {
  15. ハッシュマップ[要素] = 1;
  16. });
  17.  
  18. //この場合一意の要素のみプッシュたいので、すでに追加したもの追跡するためのカウンターを実装できます。
  19. secondArray.forEach(関数(要素) {
  20. ハッシュマップ[要素] === 1の場合{
  21. 交差点Array.push(要素);
  22. ハッシュマップ[要素]++;
  23. }
  24. });
  25.  
  26. 交差点の配列を返します
  27.  
  28. //時間計算量 O(n)、空間計算量 O(n)
  29. }

文字列を反転する

文字列が与えられた場合、その中の単語を逆にして出力する必要があります。たとえば、「Welcome to this Javascript Guide!」は、「emocleW ot siht tpircsavaJ !ediuG」と出力する必要があります。

  1. var string = "この Javascript ガイドへようこそ!" ;
  2.  
  3. //出力は !ediuG tpircsavaJ siht ot emocleW になります
  4. var 逆文法 = 逆文法区切り文字(文字列、 "" );
  5.  
  6. //出力は emocleW ot siht tpircsavaJ !ediuG になります
  7. var 逆各単語 = 逆セパレーター(逆文全体、 " " );
  8.  
  9. 関数reverseBySeparator(文字列、セパレーター) {
  10. string.split(separator).reverse(). join (separator)を返します
  11. }

ランダムな文字列

2 つの文字列が与えられた場合、それらが文字を逆にして形成された文字列かどうかを判断します。たとえば、Mary と Army は同じ文字ですが、順序が逆になっています。

  1. var firstWord = "メアリー" ;
  2. var secondWord = "陸軍" ;
  3.  
  4. isAnagram(firstWord, secondWord); // 
  5.  
  6. 関数isAnagram(最初 2番目) {
  7. //のために 大文字と小文字を区別しない場合は、両方の単語を小文字変更します
  8. var a = first .toLowerCase();
  9. var b = second .toLowerCase();
  10.  
  11. // 文字列をソートし  結果の配列を文字列結合します。結果を比較します
  12. a = a.split( "" ).sort(). join ( "" );
  13. b = b.split( "" ).sort(). join ( "" );
  14.  
  15. a === bを返します
  16. }

文字列を尋ねます

文字列が回文かどうかを判定します。たとえば、racecar と race car はどちらも回文です。

  1. isPalindrome( "レースカー" ); // true  
  2. isPalindrome( "レースカー" ); // true  
  3.  
  4. 関数isPalindrome(単語) {
  5. //交換する すべて非文字  「」  小文字変更する
  6. var lettersOnly = word.toLowerCase(). replace (/\s/g, "" );
  7.  
  8. //文字列を逆順にした文字列比較する
  9. lettersOnly === lettersOnly.split( "" ).reverse(). join ( "" );を返します
  10. }

スタックとキュー

2つのスタックを使用してキューイングとデキューイングを実装する

  1. var inputStack = []; //最初のスタック
  2. var outputStack = []; // 2番目のスタック
  3.  
  4. // エンキューの場合は、アイテムを最初スタックプッシュするだけです
  5. 関数enqueue(stackInput, item) {
  6. stackInput.push(item)を返します
  7. }
  8.  
  9. 関数デキュー(stackInput, stackOutput) {
  10. //出力スタック最初要素
  11. //入力スタック最後の要素その後一番上の要素をポップします 出力  
  12. //入力スタックプッシュされた最初の要素を取得します
  13. スタック出力の長さが0以下の場合
  14. スタック入力の長さが0より大きい場合
  15. var elementToOutput = stackInput.pop();
  16. 要素を出力にプッシュします。
  17. }
  18. }
  19.  
  20. stackOutput.pop()を返します
  21. }

中括弧が閉じているかどうかを確認する

指定された式内の中括弧が閉じられているかどうかを判断する関数を作成します。

  1. var 式 = "{{}}{}{}"  
  2. var 式False = "{}{{}" ;
  3.  
  4. isBalanced(式); // true  
  5. isBalanced(expressionFalse); // false  
  6. isBalanced( "" ); // 
  7.  
  8. 関数isBalanced(式) {
  9. var checkString = 式;
  10. var スタック = [];
  11.  
  12. // 空の場合、括弧は技術的にバランスが取れている
  13. (checkString.length <= 0) の場合、戻り値 真実;
  14.  
  15. ( var i = 0; i < checkString.length; i++) {
  16. if(checkString[i] === '{' ) {
  17. スタックをプッシュします(checkString[i]);
  18. }そうでない場合 (checkString[i] === '}' ) {
  19. //空の配列ポップは未定義です
  20. スタックの長さが0より大きい場合
  21. スタックをポップします。
  22. }それ以外{
  23. 戻る 間違い;
  24. }
  25. }
  26. }
  27.  
  28. // 配列 空ではない、それ バランスが取れていない
  29. (stack.pop())を返す場合 間違い;
  30. 戻る 真実;
  31. }

再帰

バイナリ変換

再帰関数を使用して入力数値をバイナリ文字列に変換します。

  1. 小数点から2進数へ(3); // 11
  2. 小数点から2進数(8); // 1000
  3. 小数点から2進数(1000); // 1111101000
  4.  
  5. 関数decimalToBinary(数字) {
  6. if(数字 >= 1) {
  7. // 数字  2割り切れない場合は再帰的に処理を戻す
  8. //バイナリ  1を引いた数字残りの1桁1を加算する
  9. if (数字 % 2) {
  10. 戻り値:decimalToBinary((digit - 1) / 2) + 1;
  11. }それ以外{
  12. // 再帰的に次2進数を返す
  13. 戻り値:decimalToBinary(digit / 2) + 0;
  14. }
  15. }それ以外{
  16. // 終了条件
  17. 戻る  '' ;
  18. }
  19. }

バイナリ検索

  1. 関数recursiveBinarySearch(配列, 値, 左位置, 右位置) {
  2. // 値 DNE
  3. 左位置 > 右位置の場合、 -1 を返します
  4.  
  5. var middlePivot = Math.floor((leftPosition + rightPosition) / 2);
  6. if (配列[middlePivot] === 値) {
  7. middlePivotを返します
  8. }そうでない場合 (配列[middlePivot] > 値) {
  9. recursiveBinarySearch(配列、値、左位置、中央ピボット - 1)を返します
  10. }それ以外{
  11. recursiveBinarySearch(配列、値、middlePivot + 1、rightPosition)を返します
  12. }
  13. }

番号

2の指数値であるかどうかを判定する

  1. isPowerOfTwo(4); // 
  2. isPowerOfTwo(64); // 
  3. isPowerOfTwo(1); // 
  4. isPowerOfTwo(0); // 
  5. isPowerOfTwo(-1); // 
  6.  
  7. //ゼロ以外場合:
  8. 関数isPowerOfTwo(数値) {
  9. // `&` はビット単位の n を使用します。
  10. //この場合 数 = 4の場合、式は次の式同一になります
  11. // ` return (4 & 3 === 0)`
  12. // ビット単位では、4は100、3011です。&を使用すると、2つの 同時に
  13. // スポット1の場合、結果1、それ以外の場合は0です。この場合 000を返します
  14. //したがって、4 つの条件を満たす式になります。
  15. // 逆、式` return (5 & 4 === 0)` の場合はfalseになります 
  16. // 101を返すので、100 = 100 ( NOT === 0)
  17.  
  18. 数値 & (数値 - 1) === 0を返します
  19. }
  20.  
  21. //ゼロ場合:
  22. 関数isPowerOfTwoZeroCase(数値) {
  23. 戻り値: (数値 !== 0) && ((数値 & (数値 - 1)) === 0);
  24. }

[この記事は51CTOコラムニスト「張子雄」によるオリジナル記事です。転載が必要な場合は51CTOを通じて著者にご連絡ください]

この著者の他の記事を読むにはここをクリックしてください

<<:  顔認識の3つの主要技術と4つの主要機能

>>:  基本的なアルゴリズムの学習ルートとランダムな考え

ブログ    
ブログ    

推薦する

...

フェデレーテッドラーニング - プライバシーの障壁を突破し、データの価値を引き出す

1. フェデレーテッドラーニングの背景従来の機械学習手法では、トレーニングのためにデータを単一のマシ...

...

マイクロソフト、データセンターに十分なAIチップが供給されない場合、サービスが中断すると警告

7月29日のニュース、海外メディアの報道によると、マイクロソフトは投資家に対し、グラフィックス・プロ...

「ICV革新的アルゴリズム研究タスク」が正式にリリースされました!登録は11月18日に開始されます

中国自動車工程協会と国家インテリジェントコネクテッドビークルイノベーションセンターは、「2021年第...

AIのトップ研究者からのアドバイス:あなたもAIに取り組んでいると聞きましたが、この4つの落とし穴にはまらないように!

人工知能の人気が高まってきており、人工知能分野でビジネスを始めたい人も増えてきています。しかし、人工...

ナレッジグラフの紹介と応用

[[376661]]人間は知識を獲得する過程で、物事の本質にますます注意を払うようになります。人工知...

...

日本は人間支援ロボットの世界標準を確立したいと考えている

日本は人間支援ロボットの規格策定に向け、国際標準化機構(ISO)と協議を行っている。ロボット工学に対...

組み込みアルゴリズム: ビッグデータ可変長ストレージアルゴリズム

1. 適用シナリオ高精度のサンプリング結果の場合、最大値には 3 バイト、最小値には 1 バイトが必...

...

OT システムは、生成 AI によってもたらされるセキュリティ上の課題にどのように対処するのでしょうか?

現在、ほとんどのサイバー攻撃では、データの流出とデータの暗号化という 2 つの主な方法が使用されてい...

マイクロソフト、Nvidia が 5300 億の NLP モデル「Megatron-Turing」をリリース、価格は A100 で 4480 台

[[428336]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...

AIシステムのグレーディングを通じて企業のコスト管理を支援

翻訳者 | 張毅校正 | 梁哲、孫淑娟自動車技術協会(SAE)が自動運転車を分類しているのと同じよう...

CCTV:AI修復により、生産ラインから出荷された国産車の最初のバッチを再現

IT Homeは7月4日、解放CA10トラックが1956年7月に生産ラインから出荷されたと報じた。こ...