js共通アルゴリズムの概要

1. 単語が回文であるかどうかを判断しますか?

回文とは、次のテキスト内の同じ語彙や文の位置を変更したり反転させたりして、前後にループする面白さをもたらすことを指します。回文と呼ばれ、ループバックとも呼ばれます。ママムリディバイダーなど。

多くの人がこのような話題になったとき、for を使用して文字列のアルファベット順を逆にしてから一致させることを考えるのは非常に簡単です。実際、検討すべき最も重要なことは、逆転の実現です。実際、既製の関数を使用して文字列を配列に変換することができます。この考え方は非常に重要であり、文字列操作をより自由に実行できます。

function checkPalindrom(str) {  
    return str == str.split('').reverse().join('');
}

2. 一連の整数配列から重複した値を削除します

たとえば、入力: [1,13,24,11,11,14,1,2]、出力: [1,13,24,11,14,2] の場合、繰り返される要素 11 と 1 を削除する必要があります。

主に個人によるオブジェクトの使用を検査し、キーを使用してフィルタリングします。

let unique = function(arr) {  
  let hashTable = {};
  let data = [];
  for(let i=0,i<arr.length;i++) {
    if(!hashTable[arr[i]]) {
      hashTable[arr[i]] = true;
      data.push(arr[i]);
    }
  }
  return data

}

3. 文字列内で最も多く出現する文字を数えます。

英語の連続した英語の文字列が与えられた場合、最も頻繁に出現する文字を見つけます。

例: 入力: afjghdfraaaasdenas 出力: a

以前の重いアルゴリズムは過去に登場しましたが、ここでは繰り返しの回数をカウントする必要があります。

function findMaxDuplicateChar(str) {  
  if(str.length == 1) {
    return str;
  }
  let charObj = {};
  for(let i=0;i<str.length;i++) {
    if(!charObj[str.charAt(i)]) {
      charObj[str.charAt(i)] = 1;
    }else{
      charObj[str.charAt(i)] += 1;
    }
  }
  let maxChar = '',
      maxValue = 1;
  for(var k in charObj) {
    if(charObj[k] >= maxValue) {
      maxChar = k;
      maxValue = charObj[k];
    }
  }
  return maxChar;

}

4. ソートアルゴリズム

アルゴリズムの話題となると、アルゴリズムの実装に限らず、比較的オープンな話題が多いはずですが、いくつかのアルゴリズムを習得する必要があるため、比較的基本的でわかりやすいアルゴリズムであるバブルソートは必須です。心の中に記憶されている。バブルソートのアルゴリズムは、順番に大きさを比較し、小さいものと大きいものの位置を入れ替えます。

function bubbleSort(arr) {  
    for(let i = 0,l=arr.length;i<l-1;i++) {
        for(let j = i+1;j<l;j++) { 
          if(arr[i]>arr[j]) {
                let tem = arr[i];
                arr[i] = arr[j];
                arr[j] = tem;
            }
        }
    }
    return arr;
}

その他のソート: クイックソート

function quickSort(arr) {

    if(arr.length<=1) {
        return arr;
    }

    let leftArr = [];
    let rightArr = [];
    let q = arr[0];
    for(let i = 1,l=arr.length; i<l; i++) {
        if(arr[i]>q) {
            rightArr.push(arr[i]);
        }else{
            leftArr.push(arr[i]);
        }
    }

    return [].concat(quickSort(leftArr),[q],quickSort(rightArr));
}

5. 2 つの整数を交換するために一時変数を使用しないでください。

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

  この種の問題は非常に独創的であり、誰もが通常の考え方を飛び出して、a と b を使用して置き換える必要があります。

  主に + - を使用して演算を実行します。a = a + ( b - a) は実際には最後の a = b と同等です。

function swap(a , b) {  
  b = b - a;
  a = a + b;
  b = a - b;
  return [a,b];
}

キャンバスを使用して有限フィボナッチ数列曲線を描画しますか?

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

斐波那契数列黄金分割数列とも呼ばれる、0、1、1、2、3、5、8、13、21、34 などの数列を指します。数学では、フィボナッチ数列は主に再帰呼び出しを調べます。定義は大体わかっています

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

フィボナッチ配列の生成方法

function getFibonacci(n) {  
  var fibarr = [];
  var i = 0;
  while(i<n) {
    if(i<=1) {
      fibarr.push(i);
    }else{
      fibarr.push(fibarr[i-1] + fibarr[i-2])
    }
    i++;
  }

  return fibarr;
}

残りの作業は、キャンバス arcメソッドを使用して曲線を描画することです。

7. 次の正の配列の最大差を見つけます。

例: 入力 [10,5,11,7,8,9] 出力 6

これは、基本的な配列の最大値の検索をテストするための質問です。明らかに、最大の差は配列内の最大値と最小値の差である必要があることがわかります。

function getMaxProfit(arr) {

    var minPrice = arr[0];
    var maxProfit = 0;

    for (var i = 0; i < arr.length; i++) {
        var currentPrice = arr[i];

        minPrice = Math.min(minPrice, currentPrice);

        var potentialProfit = currentPrice - minPrice;

        maxProfit = Math.max(maxProfit, potentialProfit);
    }

    return maxProfit;
}

8. 指定した長さの文字列をランダムに生成します

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

例:長さが 8 の場合、4ldkfg9j を出力します。

function randomString(n) {  
  let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
  let tmp = '',
      i = 0,
      l = str.length;
  for (i = 0; i < n; i++) {
    tmp += str.charAt(Math.floor(Math.random() * l));
  }
  return tmp;
}

9. getElementsByClassName と同様の関数を実装します。

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

function queryClassName(node, name) {  
  var starts = '(^|[ \n\r\t\f])',
       ends = '([ \n\r\t\f]|$)';
  var array = [],
        regex = new RegExp(starts + name + ends),
        elements = node.getElementsByTagName("*"),
        length = elements.length,
        i = 0,
        element;

    while (i < length) {
        element = elements[i];
        if (regex.test(element.className)) {
            array.push(element);
        }

        i += 1;
    }

    return array;
}

10. JSを使用して二分探索木を実装する(二分探索木)

一般に、すべてを書く可能性は比較的低いですが、内容を理解し、いくつかの基本的な機能を理解することに集中してください。二分探索木 (バイナリサーチ ツリー) は、二分探索木とも呼ばれ、順序付き二分木 (英語: Ordered binary Tree) とは、空の木、または次の特性を持つ二分木を指します。

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

 

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

class Node {  
  constructor(data, left, right) {
    this.data = data;
    this.left = left;
    this.right = right;
  }
}

ツリーはルートノードから各子ノードまで徐々にノードが伸びていくことで構成されており、ルートノードとノードの追加、検索、削除のメソッドを備えた基本構造となっています。

class BinarySearchTree {

  constructor() {
    this.root = null;
  }

  insert(data) {
    let n = new Node(data, null, null);
    if (!this.root) {
      return this.root = n;
    }
    let currentNode = this.root;
    let parent = null;
    while (1) {
      parent = currentNode;
      if (data < currentNode.data) {
        currentNode = currentNode.left;
        if (currentNode === null) {
          parent.left = n;
          break;
        }
      } else {
        currentNode = currentNode.right;
        if (currentNode === null) {
          parent.right = n;
          break;
        }
      }
    }
  }

  remove(data) {
    this.root = this.removeNode(this.root, data)
  }

  removeNode(node, data) {
    if (node == null) {
      return null;
    }

    if (data == node.data) {
      // no children node
      if (node.left == null && node.right == null) {
        return null;
      }
      if (node.left == null) {
        return node.right;
      }
      if (node.right == null) {
        return node.left;
      }

      let getSmallest = function(node) {
        if(node.left === null && node.right == null) {
          return node;
        }
        if(node.left != null) {
          return node.left;
        }
        if(node.right !== null) {
          return getSmallest(node.right);
        }

      }
      let temNode = getSmallest(node.right);
      node.data = temNode.data;
      node.right = this.removeNode(temNode.right,temNode.data);
      return node;

    } else if (data < node.data) {
      node.left = this.removeNode(node.left,data);
      return node;
    } else {
      node.right = this.removeNode(node.right,data);
      return node;
    }
  }

  find(data) {
    var current = this.root;
    while (current != null) {
      if (data == current.data) {
        break;
      }
      if (data < current.data) {
        current = current.left;
      } else {
        current = current.right
      }
    }
    return current.data;
  }

}

module.exports = BinarySearchTree;

転載アドレス: https://www.jackpu.com/qian-duan-mian-shi-zhong-de-chang-jian-de-suan-fa-wen-ti/

おすすめ

転載: blog.csdn.net/guoweifeng0012/article/details/95078384