フロントエンドの面接でよく聞かれるアルゴリズムに関する質問

フロントエンドの面接でよく聞かれるアルゴリズムに関する質問

ただし、フロントエンドでアルゴリズムに触れる機会はほとんどありません。ほとんどがインタラクティブな操作ですが、大手企業のインタビューから判断すると、アルゴリズムは依然として評価の一側面となっています。実際、データ構造とアルゴリズムを学ぶことは、エンジニアが問題を理解し分析するのに役立ちます。将来、より複雑な問題に直面した場合、これらの基本的な知識を蓄積することで、解決策をより最適化できるようになります。フロントエンドの面接でよく聞かれる質問をいくつか紹介します。

Q1 単語が回文であるかどうかを判断するにはどうすればいいですか?

回文とは、同じ単語や文が次のテキストで入れ替わったり逆になったりして、ループ効果を生み出す文です。これを回文またはループと呼びます。たとえば、mamam redivider などです。

多くの人がこのような質問を受けたとき、 for を使用して文字列のアルファベット順を逆にしてから一致させることを簡単に思いつくでしょう。実は、検討すべき重要な点は、リバースの実装です。実際、既製の関数を使用して文字列を配列に変換できます。このアイデアは非常に重要です。文字列操作をより自由に実行できるようになります。

  1. 関数checkPalindrom(str) {
  2.  
  3. str == str.split( '' ).reverse(). join ( '' )を返します
  4.  
  5. }

Q2 整数配列から重複した値を削除する

たとえば、次のように入力します: [1,13,24,11,11,14,1,2]

出力: [1,13,24,11,14,2]

繰り返される要素 11 と 1 を削除する必要があります。

この質問は、フロントエンドの面接の多くの質問に出てきます。主に、オブジェクトの使用とスクリーニングのためのキーの使用を調べます。

  1. /**
  2. *ユニークな配列
  3. **/
  4. ユニーク=関数(arr) {
  5. ハッシュテーブルを {} とします。
  6. データ = [] とします。
  7. (i=0,l=arr.length;i<l;i++)の場合{
  8. if(!hashTable[arr[i]]) {
  9. ハッシュテーブル[arr[i]] = true ;
  10. データ.push(arr[i]);
  11. }
  12. }
  13. データを返す
  14.   
  15. }
  16.   
  17. module.exports =ユニーク;

Q3 文字列内の最も一般的な文字を数える

連続した英語の文字列が与えられたとき、最も多く出現する文字を見つけます。

入力: afjghdfraaaasdenas

出力:

繰り返し回数を数えるには、先ほど登場した繰り返し回数を計算するアルゴリズムが必要になります。

  1. 関数findMaxDuplicateChar(str) {
  2. str.length == 1の場合{
  3. strを返します
  4. }
  5. charObj = {} とします。
  6. (i=0;i<str.length;i++)の場合{
  7. if(!charObj[str.charAt(i)]) {
  8. charObj[str.charAt(i)] = 1;
  9. }それ以外{
  10. charObj[str.charAt(i)] += 1;
  11. }
  12. }
  13. maxChar = ''とします
  14. 最大値 = 1;
  15. (var k in charObj)の場合{
  16. if(charObj[k] >= maxValue) {
  17. 最大文字数 = k;
  18. 最大値 = charObj[k];
  19. }
  20. }
  21. maxCharを返します
  22.   
  23. }
  24.   
  25. モジュール.exports = findMaxDuplicateChar;

Q4 ソートアルゴリズム

アルゴリズムに関する質問を受けた場合、そのほとんどは比較的オープンな質問であるはずです。アルゴリズムの実装を制限するものではありませんが、いくつかのアルゴリズムを習得する必要があります。したがって、比較的基本的で理解しやすく、記憶しやすいアルゴリズムであるバブルソートは、必ず記憶する必要があります。バブルソートアルゴリズムは、サイズを順番に比較し、小さい方と大きい方の位置を交換します。

  1. 関数bubbleSort(arr) {
  2. ( i = 0,l=arr.length;i<l-1;i++とします) {
  3. (j = i+1;j<l;j++)の場合
  4. もしarr[i]>arr[j]であれば
  5. tem = arr[i]とします。
  6. arr[i] = arr[j];
  7. arr[j] = tem;
  8. }
  9. }
  10. }
  11. arrを返します
  12. }
  13. モジュール.exports = bubbleSort;

バブルソート以外にも、挿入ソート、クイックソート、シェルソートなど、実は他にもたくさんのソートが存在します。各ソートアルゴリズムには独自の特性があります。すべてを習得する必要はありませんが、いくつかのアルゴリズムに精通している必要があります。 たとえば、クイックソートは非常に効率的で、その基本原理は図のとおりです (wiki より)。

このアルゴリズムは、特定の要素の値を参照し、それより小さい値を左の配列に、それより大きい要素を右の配列に格納し、左の配列と右の配列に対して最後の操作を再帰的に実行し、マージされた配列、つまりソートされた配列を返します。

  1. 関数quickSort(arr) {
  2.   
  3. 長さ<=1の場合{
  4. arrを返します
  5. }
  6.   
  7. leftArr = [] とします。
  8. rightArr = [] とします。
  9. q = arr[0]とします。
  10. (i = 1,l=arr.length; i<l; i++)の場合{
  11. もしarr[i]>qの場合{
  12. 右Arr.push(arr[i]);
  13. }それ以外{
  14. 左Arr.push(arr[i]);
  15. }
  16. }
  17.   
  18. [].concat(quickSort(leftArr),[q],quickSort(rightArr))を返します
  19. }
  20.   
  21. モジュール.exports = クイックソート;

皆さんに学習リンクを紹介し、アニメーションを通じてアルゴリズムの実装を実演したいと思います。

HTML5 Canvas デモ: ソートアルゴリズム (http://math.hws.edu/eck/jsdemo/sortlab.html)

Q5 一時変数を使わずに2つの整数を交換する

入力 a = 2、b = 4 出力 a = 4、b = 2

このタイプの質問は非常に巧妙で、通常の方法から離れて考え、a と b を代入して使用する必要があります。

主に + – を使用して計算を実行します。たとえば、a = a + ( b – a) は実際には *** の a = b と同等です。

  1. 関数swap(a, b) {
  2. b = b - a;
  3. a = a + b;
  4. b = a - b;
  5. [a,b]を返します
  6. }
  7.   
  8. モジュールをエクスポートしてスワップします。

Q6 キャンバスを使用して有限フィボナッチ数列曲線を描くにはどうすればよいでしょうか?

シーケンスの長さは 9 に制限されます。

フィボナッチ数列は黄金比数列とも呼ばれ、0、1、1、2、3、5、8、13、21、34、... のような数列を指します。数学では、フィボナッチ数列は主に再帰呼び出しを調べます。定義は一般的に知られている

  1. fibo[i] = fibo[i-1]+fibo[i-2];

フィボナッチ配列を生成する方法

  1. 関数getFibonacci(n) {
  2. var fibarr = [];
  3. var i = 0;
  4. i<n の間 {
  5. i<=1の場合{
  6. fibarr.push(i);
  7. }それ以外{
  8. fibarr.push(fibarr[i-1] + fibarr[i-2])
  9. }
  10. 私は++;
  11. }
  12.   
  13. fibarrを返します
  14. }

残りの作業は、キャンバスアーク法を使用して曲線を描くことです。

デモ (http://codepen.io/Jack_Pu/pen/LRaxZB)

Q7 たとえば、次の正の配列の *** 差を求めます。

入力[10,5,11,7,8,9]

出力6

これは、基本配列の最大値の検索をテストする質問です。明らかに、最大差は配列内の最大値と最小値の差でなければならないことはわかっています。

  1. 関数getMaxProfit(arr) {
  2.   
  3. var minPrice = arr[0];
  4. var 最大利益 = 0;
  5.   
  6. (var i = 0; i < arr.length; i++)の場合{
  7. var 現在の価格 = arr[i];
  8.   
  9. minPrice = Math.min (minPrice, 現在の価格);
  10.   
  11. var potentialProfit = 現在の価格 - 最小価格;
  12.   
  13. 最大利益 = Math.max (最大利益、潜在的利益);
  14. }
  15.   
  16. maxProfitを返します
  17. }

Q8 指定された長さの文字列をランダムに生成する

指定された長さの文字列をランダムに生成するアルゴリズムを実装します。

例えば、長さが8の場合、出力は4ldkfg9jとなる。

  1. 関数ランダム文字列(n) {
  2. str = 'abcdefghijklmnopqrstuvwxyz9876543210'とします
  3. tmp = ''とします
  4. i = 0,
  5. l = 文字列の長さ;
  6. (i = 0; i < n; i++)の場合{
  7. tmp += str.charAt(Math.floor(Math.random() * l));
  8. }
  9. tmpを返します
  10. }
  11.   
  12. モジュール.exports = ランダム文字列;

Q9 getElementsByClassNameに似た関数を実装する

特定のクラスを含む特定の DOM ノードの下にあるすべての DOM ノードを検索する関数を自分で実装しますか? ネイティブ システムによって提供される getElementsByClassName querySelectorAll などのネイティブ DOM 検索関数を使用することはできません。

  1. 関数queryClassName(ノード、名前) {
  2. var starts = '(^|[ \n\r\t\f])'
  3. 終了 = '([ \n\r\t\f]|$)' ;
  4. var 配列 = [],
  5. regex = 新しい RegExp(開始 +名前+ 終了)、
  6. 要素 = node.getElementsByTagName( "*" )、
  7. 長さ = 要素.長さ、
  8. i = 0,
  9. 要素;
  10.   
  11. (i < 長さ) の間 {
  12. 要素 = elements[i];
  13. if (regex.test(要素.className)) {
  14. 配列.push(要素);
  15. }
  16.   
  17. 私 += 1;
  18. }
  19.   
  20. 配列を返します
  21. }

Q10 JSを使用して二分探索木を実装する

一般的に言えば、タスク全体を完了する可能性は比較的低いですが、タスクの理解といくつかの基本機能の実装に重点が置かれます。 バイナリ検索ツリーは、バイナリ検索ツリーまたは順序付きバイナリツリーとも呼ばれ、次のプロパティを持つ空のツリーまたはバイナリツリーです。

  • いずれかのノードの左サブツリーが空でない場合、左サブツリー上のすべてのノードの値はルートノードの値よりも小さくなります。
  • いずれかのノードの右サブツリーが空でない場合、右サブツリー上のすべてのノードの値はルートノードの値よりも大きくなります。
  • 任意のノードの左と右のサブツリーもバイナリ検索ツリーです。
  • 等しいキー値を持つノードはありません。他のデータ構造と比較したバイナリ検索ツリーの利点は、検索と挿入の時間計算量が低いことです。それはO(log n)です。二分探索木は、セット、マルチセット、連想配列などのより抽象的なデータ構造を構築するために使用される基本的なデータ構造です。

記述する際には、二分探索木の特性を十分に理解し、各ノードのデータ構造を最初に設定する必要があります。

  1. クラスノード{
  2. コンストラクター(データ、) {
  3. this.data = データ;
  4. this.left =;
  5. this.right =;
  6. }
  7. }

ツリーは、ルートノードから各子ノードへと段階的に拡張されるノードで構成されているため、ルートノードと、ノードの追加、検索、削除のメソッドを持つのが基本的な構造です。

  1. クラス BinarySearchTree {
  2.   
  3. コンストラクタ() {
  4. this.root = null ;
  5. }
  6.   
  7. 挿入(データ){
  8. n = new Node(data, null , null );とします。
  9. もし (!this.root) {
  10. this.root = nを返します
  11. }
  12. currentNode を this.root とします。
  13. 親をnullにします
  14. 一方(1){
  15. 親 = 現在のノード;
  16. データ < currentNode.data の場合 {
  17. 現在のノード =現​​在のノード.left;
  18. (currentNode === null )の場合{
  19. 親.left = n ;
  20. 壊す;
  21. }
  22. }それ以外{
  23. 現在のノード =現​​在のノード.right;
  24. (currentNode === null )の場合{
  25. 親の右端= n;
  26. 壊す;
  27. }
  28. }
  29. }
  30. }
  31.   
  32. 削除(データ) {
  33. this.root = this.removeNode(this.root、データ)
  34. }
  35.   
  36. ノードを削除します(ノード、データ) {
  37. if (ノード == null ) {
  38. 戻る ヌル;
  39. }
  40.   
  41. if (データ == node.data) {
  42. //子ノードなし
  43. ノード.left == null && ノード.right == null の場合{
  44. 戻る ヌル;
  45. }
  46. ノード.left == null )の場合{
  47. node.rightを返します
  48. }
  49. ノード.right == null )の場合{
  50. node.leftを返します
  51. }
  52.   
  53. getSmallest =関数(ノード) {
  54. if( node.left === null && node.right == null ) {
  55. ノードを返します
  56. }
  57. if( node.left != null ) {
  58. node.leftを返します
  59. }
  60. if( node.right !== null ) {
  61. getSmallest ( node.right )を返します
  62. }
  63.   
  64. }
  65. temNode = getSmallest( node.right ) とします。
  66. ノードデータ = temNode.data;
  67. temNode からデータを削除します
  68. ノードを返します
  69.   
  70. }そうでない場合 (データ < node.data) {
  71. ノードを左から左にドラッグします
  72. ノードを返します
  73. }それ以外{
  74. ノードをから削除します
  75. ノードを返します
  76. }
  77. }
  78.   
  79. find(データ) {
  80. var現在の値= this.root;
  81. while (現在値!= null ) {
  82. if (データ ==現在の.data) {
  83. 壊す;
  84. }
  85. if (データ <現在の.data) {
  86. current = current . left ;
  87. }それ以外{
  88. 現在=現在. 
  89. }
  90. }
  91. 戻る 現在の.data;
  92. }
  93.   
  94. }
  95.   
  96. モジュールをエクスポートします。

完全なコード Github (https://github.com/JackPu/JavaScript-Algorithm-Learning)

さらに読む

https://www.interviewcake.com/question/javascript/rectangular-love

http://stackoverflow.com/questions/21853967/get-elements-by-class-a-or-b-in-javascript

http://codepen.io/Jack_Pu/pen/EgrXBp

http://javascript-html5-tutorial.com/javascript でのアルゴリズムとデータ構造.html

<<:  ディープラーニングツール: TensorFlow と NLP モデル

>>:  ディープラーニングとディープクローニング: チャットボットにとってより優れたソリューションはどちらでしょうか?

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

人工知能を活用して会社のウェブサイトをより良く作成する方法

ここでは、テクノロジーの進歩に合わせて AI を使用して、より発展し、より強力になる Web サイト...

AIを優先する際にITの基礎を軽視してはいけない

GenAI は多くの企業の IT プロジェクトで引き続き主流を占めており、ビジネス リーダーの 3 ...

スマートホームのヒューマンマシンインターフェース (HMI) におけるエッジ AI

消費者は、利便性、安全性、ユーザーエクスペリエンスを向上させる進歩を飽くなき欲求で求めています。ヒュ...

...

ハッカーが、さまざまなネットワーク攻撃コードを自動生成できる悪質なAIツールFraudGPTを公開

7月31日、「ハッカーがAIを使って犯罪ツールを作る」という研究者の懸念が徐々に現実のものとなりつつ...

あなたたちは AI を大々的に宣伝していますが、AI はまだ 4 歳児ほど賢くありません。

研究によると、人工知能は強力に聞こえますが、現在の高度な人工知能は、人間の 4 歳児が簡単に解決でき...

...

...

CNNとRNNについての簡単な説明

[[338562]] 【51CTO.comオリジナル記事】 1 はじめに前回の記事では、ディープラー...

メタバースの目!メタの機械式バイオニックアイの特許が明らかになり、バイオニック人体に搭載される予定

ロボットの皮膚、空気圧触覚手袋... Meta は将来のメタバースに、よりリアルな触覚インタラクショ...

AR/VRが製造業の自動化とロボット工学の発展を促進する方法

この記事では、AR/VR テクノロジーがロボットにどのように貢献し、工場や産業にどのようなメリットを...

...

人工知能、機械学習、アルゴリズムが施設・資産管理に与える影響

急速に進化する今日のテクノロジーの世界では、「人工知能」、「機械学習」、「アルゴリズム」などの用語が...

スタートアップにハイエンド AI を実装するにはどうすればよいでしょうか?

【51CTO.comオリジナル記事】 [[193891]] 人工知能は、1956 年のダートマス会...

...