首頁  >  文章  >  web前端  >  JS實作的幾個常用演算法

JS實作的幾個常用演算法

高洛峰
高洛峰原創
2016-12-07 10:03:21818瀏覽

(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)使用快速排序演算法對陣列進行排序

這裡麵包括兩種效果,一種是利用快排的特性實現了去重快排,另一種是不去重的快排。

原理:取得目標數組,選定一個元素最為標誌位,遍歷剩餘的元素,比標誌位大放異彩右邊,比標誌位小放左邊。

    特別注意:還有與標誌位相等的元素,如果你儲存相等的元素,就實現了去重,如果儲存了,就不去重。

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)不借助第三個變數實現兩個變數交換值

:就是一個變數替換,原理很巧妙,只能用於數字的思維。

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)求一個陣列的最大差值

原理:遍歷一次數組,找到最大值和最小值,返回差值

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;
}

的隨機字串

原理:可以手動指定字元庫及隨機字元長度n,利用Math.floor()和Math.random()兩個方法實作取得隨機字元。

var getRandomString = function(n){
  // 定义随机字符串的字符库
  let str = &#39;qwertyuiopasdfghjklzxcvbnm1234567890&#39;;
  // 定义一个临时变量tmp存储生成的随机字符串
  let tmp = &#39;&#39;;
  //获取str的长度
  let len = str.length;
  // 生成一个长度为n的随机字符串
  for(let i = 0; i < n; i++){
    tmp += str.charAt(Math.floor(Math.random() * len));
  }
  return tmp;
}

   

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn