ホームページ  >  記事  >  ウェブフロントエンド  >  JS で実装されたいくつかの一般的なアルゴリズム

JS で実装されたいくつかの一般的なアルゴリズム

高洛峰
高洛峰オリジナル
2016-12-07 10:03:21857ブラウズ

(1) 配列の重複排除

原則: オブジェクトobjを定義し、その配列要素をobjの属性名として使用し、その属性名が重複しているかどうかを使用して重複を判断します

var unique = function(arr){
  let obj = {};
  let newArr = [];
  arr.forEach(function(x){
    if(!obj[x]){ //如果对象中没有该元素对应的属性
      obj[x] = true;
      newArr.push(x);
    }
  });
  return newArr;
}


(2 ) クイック ソート アルゴリズムを使用して配列の並べ替えを行います

これには 2 つの効果が含まれます。1 つは、クイック ソートの特性を使用して重複排除のない迅速な並べ替えを実現すること、もう 1 つは重複排除のない迅速な並べ替えです。

原則: ターゲット配列を取得し、フラグとして要素を選択し、残りの要素を走査し、フラグより大きい場合は右側に配置し、フラグより小さい場合は左側に配置します。

特記事項: フラグビットに等しい要素が存在する場合、それらを格納すると重複排除は行われません。

var quickSort = function(arr){
  if(arr.length <= 1){
    return arr;
  }
  //定义一个左数组,定义一个右数组
  let leftArr = [];
  let rightArr = [];
  //选定一个参照值
  let tag = arr[0];
  /*
   * 使用如下方式判断,会把重复元素去掉,就实现了快排的同时去重
   */
  for(let i = 0; i < arr.length; i++){
    if(arr[i] < tag){ //将比tag小的元素放在左数组中
      leftArr.push(arr[i]);
    }
    if(arr[i] > tag){ //将比tag大的元素放在右数组中
      rightArr.push(arr[i]);
    }
  }
  /*
   * 使用如下方式就是使用快排进行排序,不去重
   */
  for(let i = 1; i < arr.length; i++){
    if(arr[i] < tag){ //将比tag小的元素放在左数组中
      leftArr.push(arr[i]);
    }else{ //将比tag大的元素放在右数组中
      rightArr.push(arr[i]);
    }
  }
  //递归调用
  return [].concat(quickSort(leftArr),[tag],quickSort(rightArr));
}


(3) 文字列内で最も頻繁に出現する文字を数えます

原理: これは、オブジェクト obj を使用して、配列要素をオブジェクトの属性名として使用することにも似ています。オブジェクトが存在しない場合、属性名、値は 1 に割り当てられ、存在する場合、値は 1 ずつ増加します。

var maxShowTimes = function(str){
  // 创建一个用于判重的对象
  let obj = {};
  // 判断字符串是否为空或只有一个元素
  if(str.length <= 1){
    return str.length === 0?&#39;字符串不能为空&#39;:str;
  }
  // 利用String的charAt()方法获取各个字符
  for(let i = 0; i <= str.length; i++){
    if(!obj[str.charAt(i)]){ //如果不存在
      obj[str.charAt(i)] = 1;
    }else{ //如果存在
      obj[str.charAt(i)] += 1;
    }
  }
  // 在obj对象中寻找值最大的那个属性
  let maxChar = &#39;&#39;;
  let maxTimes = 0;
  for(var k in obj){
    if(obj[k] > maxTimes){
      maxChar = k;
      maxTimes = obj[k];
    }
  }
  return maxChar;
}


(4) 3 番目の変数を使用せずに 2 つの変数の交換値を実現するには

原則: これは変数の置換であり、アイデアは非常に巧妙で、数値の交換にのみ使用できます。 。

var swap = function(a,b){
  if(a === b){
    return [a,b];
  }
  b = b - a; // 此处的 b - a中的b和a的值是最初的值
  a = a + b; // a = a + b -a; 实现了将b的值赋给a
  b = a - b; // b = a - (b - a) = 2a - b 相当于 2b = 2a;实现了将a的值赋给b
  return [a,b];
}


(5) 配列の最大の差を見つけます

原則: 配列を 1 回走査し、最大値と最小値を見つけ、その差を返します

var getMaxProfit = function(arr){
  // 定义两个变量,分别存贮最大值和最小值
  let maxNum = arr[0];
  let minNum = arr[0];
  for(let i = 0; i < arr.length; i++){
    if(arr[i] > maxNum){
      maxNum = arr[i];
    }
    if(arr[i] < minNum){
      minNum = arr[i];
    }
  }
  return maxNum - minNum;
}


(6) Get任意の長さ ランダム文字列の原則

: 文字ライブラリとランダムな文字の長さ n を手動で指定し、Math.floor() メソッドと Math.random() メソッドを使用してランダムな文字を取得できます。

りー



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。