js基础算法,包含数组的多种用法

前言

最近和朋友谈起数据结构与算法的时候。感觉自己对此不能随心应手;特此整理篇以做复习并着手梳理知识结构;由于内容比较多,现在整理的是最为基础的内容,比如数组的各种方法和demo以及排序等等。

参考有:FreeCodeCamp,codewars, 阮一峰, 追梦子

数组去重

  1. 最简单
   function unique(arr){
       var ret = [];
       for(var i=0; i<arr.length;i++){
           if(ret.indexOf(arr[i]) === -1){
               ret.push(arr[i]);
           }
       }
       return ret;
   }

   var arrs = [1,1,2,3,4,5,3,4,6];
   unique(arrs);    //[1, 2, 3, 4, 5, 6]
   

利用indexOf()的如果在数组中没找到字符串则返回 -1。
缺点:所有主要浏览器都支持 indexOf() 方法,但是 Internet Explorer 8 及 更早IE版本不支持该方法。

  1. 性能最高
    Array.prototype.unique2 = function(){
      var hash = {}, 
          ret = [];  //hash为hash表,ret为临时数组
      for(var i= 0;i<this.length;i++){
          var key = typeof this[i] +this[i];  //类型(typeof(this[i]))+本身  做为下文hash表中键值对的key
          if(hash[key] !== 1){       //hash中value值一般为undefined   1是下面自定义,为过滤标识
              ret.push(this[i]);
              hash[key] = 1;         // ret数组中有的 hash中key的值设为1,作为标识,用来后续过滤使用
          }
      }
      return ret;
    }
    
    var arrs = [1,1,2,3,4,5,3,4,6];
    arrs.unique2();     //[1, 2, 3, 4, 5, 6]

数组中间位置添加数组

mistake:

    function avaerageAdd(){
        var arrs = [1,2,3,4,5,6,7];
        var newEle = [223,666];
        arrs.splice(Math.floor(arrs.length/2),0,newEle);
        return arrs;
    }
    
    avaerageAdd();   // [1, 2, 3, Array(2), 4, 5, 6, 7]

correct:

     function avaerageAdd2(){
         var arrs = [1,2,3,4,5,6,7];
         var newEle = [223,666];
         arrs.splice.apply(arrs,[Math.floor(arrs.length)/2, 0].concat(newEle));
         return arrs;
     }
    
     avaerageAdd2();   //[1, 2, 3, 223, 666, 4, 5, 6, 7]
  • splice()注解
    • splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
      注释:该方法会直接对数组进行修改,改变原始数组。
  • 语法
    arrayObject.splice(index,howmany,item1,.....,itemX)
参数 描述
index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX 可选。向数组添加的新项目。
  • 说明
    splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。
    如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。

排序

  1. 快速排序:

从数组的中间拿一个值,然后通过这个值挨个和数组里面的值进行比较,如果大于的放一边,小于的放一边,然后把这些合并,再进行比较,如此反复即可。

    var quickSort = function(arr){
        if(arr.length <= 1){return arr};    // 如果只有一位,就没有必要比较
        
        var pivotIndex = Math.floor(arr.length / 2);    // 获取中间值的索引
        var pivot = arr.splice(pivotIndex, 1)[0];       // 截取中间值
        var left = [];                                  // 小于中间值放这里面
        var right =[];                                  // 大于的放着里面
        
        for(var i=0; i<arr.length; i++){
            if(arr[i]<pivot){                           // 判断是否小于
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
        
        return quickSort(left).concat([pivot],quickSort(right));    // 通过递归,上一轮比较好的数组合并,并且再次进行比较。
    }
     
     var ar = [1,4,8,0,3,5,6,4,8];
     quickSort(ar);
  • 资料:
    • 快速排序 Quicksort --阮一峰
    • 目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。
  1. 冒泡排序

随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面,简单来说就是交换它们的位置,如此反复的交换位置就可以得到排序的效果。

    function sortA(arr){
        for(var i=0;i<arr.length-1;i++){
            for(var j=i+1;j<arr.length; j++){
                
                var cur = arr[i];           //获取第一个值
                if(cur>arr[i]){             //和后一个值比较
                    
                    var index = arr[j];    // 因为需要交换值,所以会把后一个值替换,我们要先保存下来
                    
                    arr[j] = cur;    //交换值
                    arr[i] = index;
                }
            }
        }
        return arr;
    }

因为一次循环只能交换一个最大的值,所以需要再套一层for循环。(双重for循环)

Reverse a String 翻转字符串

先把字符串转化为数组,在借助数组的reverse()方法翻转数组顺序,最后把数组转化成字符串

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

var strs = "hello"
reverseString(strs);
  • split()方法是把字符串转化成数组
  • reverse() 方法翻转数组顺序
  • join() 方法是把数组转化成字符串

Factorialize a Number 计算一个整数的阶乘

计算一个整数的阶乘,如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的阶乘。阶乘通常简写成n! 例如:5!= 12345 = 120

    function factorialize(num){
        if(num<1){
            return 1;   
        }else{
            return num*factorialize(num-1);
        }
    }
    
    factorialize(5);   //120
  • 数学方面: 0! = 1 (0的阶乘为1) 故factorialize(0) = 1

check for Palindromes 检查回文

如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindromes(回文)

如果给定的字符串是回文,返回true,反之,返回false。

    function palindrome(str) {
       astr = str.replace(/[^0-9A-Za-z]/g,'').toLowerCase();
       bstr = astr.split("").reverse().join("");
       if(astr === bstr){
           return true;
       }else{
           return false;
       }
    }
    
    var strs = "eye";
    palindrome(strs);
    
    
  • 也可以匹配正则改为 /[\W_]/g/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?|]/g 32个特殊字符+空格

Find the Longest Word in a Sting

找到提供的句子中最长的单词,并计算它的长度,函数的返回值应该是一个数字;

  1. 转化为数组,sort()按str长度排列顺序,取第一个值的length
    function findLongestWord(str){
        var astr = str.split(" ");     // 转化成数组,(引号间必须有空格)
        var bstr = astr.sort(function(a,b){   //对数组中每个元素的字符串长度进行比较,按照字符串长度由大到小的排列数组顺序
            return b.length- a.length;
        });
        var lenMax = bstr[0].length;  //取出数组中第一元素(也就是最大长度的字符串)
        return lenMax;                //返回长度值
    }
    
    var strs = "The quick brown fox jumped over the lazy dog";
    findLongestWord(strs);            //6
  • sort() 方法用于对数组的元素进行排序。sort()里的函数形参(a,b),如果返回a-b,小到大排列;如果返回b-a,大到小排列;
  1. 转化为数组,初始化一个基值变量,用作对比和存储每次循环最大值
    function findLongestWord2(str) {
        myStr = str.split(" ");
        var longest = 0;
        for(var i=0; i<myStr.length;i++){
            if(myStr[i].length > longest){
                longest =myStr[i].length;
            }
        }
        return longest;
    }
    
     var strs = "The quick brown fox jumped over the lazy dog";
     findLongestWord2(strs);    // 6
  1. 转化为数组,遍历每一个值并push到一个空数组中,最后进行Math.max取最大值
    function findLongestWord3(str) {
      myStr = str.split(' ');
      var arrnum=[];
      for(i=0; i<myStr.length;i++){
          arrnum.push(myStr[i].length);
      }
      return Math.max.apply(null,arrnum);
    }
    
     var strs = "The quick brown fox jumped over the lazy dog";
     findLongestWord3(strs);     //6
posted @ 2017-08-01 17:41  逍遥超儿  阅读(536)  评论(0编辑  收藏  举报