• 面试时常遇到的数组面试题


    1.计算给定数组 arr 中所有元素的总和

    function add(arr){
    var result=0;
    for(var i = 0,item;item=arr[i++];){
    result+=item;
    }
    return result;
    }
    var arr=[1,2,3,4,5];
    console.log(add(arr))

    2.合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组

    function mix(arr1,arr2){
    
    var arr3=[];
    
    return arr3.concat(arr1,arr2);
    }
    console.log(mix([1,2,3],[2,3,4,5]))

    3:删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组

    function deleteArr(arr){
    var a=arr.slice(0);
    b=a.splice(0,1);//a.shift()
    return a
    
    }
    console.log(deleteArr([1,2,3,4,5]))


    4:在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组

    function addArr(arr,item){
    var a= arr.slice(0);
    b=a.splice(0,0,item);//a.unshift(item)
    return a;
    }
    console.log(addArr([1,2,3,4],5))


    5:移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回

    function turnBack(arr,item){
    for (var i = arr.length - 1; i >= 0; i--) {
    if(arr[i]==item){
    arr.splice(i,1);
    }
    
    }
    return arr
    }
    
    console.log(turnBack([1,2,3,3,4,5,3,6],3))

    (二)

     var arr=[1,1,1,2,2,1,3,1,3,4,5,6];
    
        function arrDel(arr){
    
          var result=[],
    
                 obj={};
    
              for(var i in arr){
    
               if(!obj[arr[i]]){ //判断对象的属性
    
                   result.push(arr[i]);
    
                      obj[arr[i]]=1;
    
               }
    
              }
    
              return result;
    
        }
    
    
    
        console.log(arrDel(arr));

     (三)

    function uniq(arr){
        var result = [];
        var flag = true;
        for(var i=0;i<arr.length;i++){
            for(var j=0;j<result.length;j++){
                if(arr[i]===result[j]){
                    flag = false;
                }   
            }
            if(flag){
                result.push(arr[i]);
            }
        }
        return result;
    }

    (四)

    function uniq(arr){
        return arr.filter(function(item,index,array){
            return array.indexOf(item) === index;
        });
    }
    uniq([1,2,1,1,4])
    // [1, 2, 4]

    (五)

    function sortAndUniq(arr){
        return arr.sort().filter(function(item,index,array){
            return item !== array[index+1];
        });
    }
    sortAndUniq([1,2,1,1,4])
    // [1, 2, 4]

    (六)

    var arr=[1,1,1,2,2,1,3,1,3,4,5,6];
        var set = new Set(arr);
        var newSet =Array.from(set);
    
        console.log(newSet) //1,2,3,4,5,6

    set()方法是ES6的新特性,部分浏览器支持

    6:找出元素 item 在给定数组 arr 中的位置

    //直接console.log([1,2,3,4,5].indexOf(2))
    
    function indexOf(arr,item){
    for (var i = arr.length - 1; i >= 0; i--) {
    if(arr[i]==item){
    return i;
    }
    }
    return -1;
    }
    console.log(indexOf([1,2,3,4,5,6],3));

    7.判断一个数组中出现次数最多的元素,统计这个次数

    function maxCountElement(arr) {  
       var obj={};
       for(var i=0;i<arr.length;i++){  
           var key=arr[i];  
           if(obj[key]){
               obj[key]++;  
           }else{  
               obj[key]=1;
           }  
       }  
     
       var maxCount=0;
       var maxElement=arr[0];
       for(var key in obj){  
           if(maxCount<obj[key]){  
               maxCount=obj[key]; 
               maxElement=key;  
           }  
       }  
       return "该数组中出现次数最多的元素:"+maxElement+"出现了"+maxCount+"次";  
        }  

    注: 上面的代码有一点小的瑕疵,如果数组中两个不同的元素出现的次数一样多,结果只会体现第一次遇见的次数最多的                   元素,和它次数一样多的其他元素会被忽略掉。

    改进方案代码如下:

    function maxCountElement(arr) {  
       var obj={};
       for(var i=0;i<arr.length;i++){  
           var key=arr[i];  
           if(obj[key]){
               obj[key]++;  
           }else{  
               obj[key]=1;
           }  
       }  
     
       var maxCount=0;
       var maxElement=arr[0];
       var eq = [];
       for(var key in obj){  
           if(maxCount < obj[key]){  
               maxCount=obj[key]; 
               maxElement=key;  
               eq.length=0;
           }else if(maxCount === obj[key]){  
               eq.push(key);
           }
       }  
       if(eq.length > 0){
           for(var j=0;j<eq.length;j++){
           maxElement+=','+eq[j];
           }
       }
       return "该数组中出现次数最多的元素:"+maxElement+"-----出现了:"+maxCount+"次";  
        }  
    
        var arr = [1,2,2,3,3,4,5,6];
        var res = maxCountElement(arr);
    
        console.log(res);

    8.计算数组中每个元素出现的次数

    var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
     
    var countedNames = names.reduce(function (allNames, name) { 
      if (name in allNames) {
        allNames[name]++;
      }
      else {
        allNames[name] = 1;
      }
      return allNames;
    }, {});
    // countedNames is:
    // { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }

    同上类似:判断一个字符串中出现次数最多的字母:

    function maxCount(str) {  
       var obj={};
       for(var i=0;i<str.length;i++){  
           var key=str[i];  
           if(obj[key]){
               obj[key]++;  
           }else{  
               obj[key]=1;
           }  
       }  
     
       var maxCount=0;
       var maxString="";
       for(var key in obj){  
           if(maxCount<obj[key]){  
               maxCount=obj[key]; 
               maxString=key;  
           }  
       }  
       return "出现次数最多的字母:"+maxString+"出现了"+maxCount+"次";  
    
        }  

    (二)

     var json={}; //定义对象来存放 对象属性的值
    
    
    
       //遍历字符串,将重复出现的字符 累加
    
       for(var i=0;i<str.length;i++){
    
         if(!json[str.charAt(i)]){
    
                json[str.charAt(i)]=1;
    
         }else{
    
             json[str.charAt(i)]++;
    
         }
    
       }
    
    
    
       var iMax=0;
    
       var icur='';
    
       console.log(json);//{a:3,d:8,f:7,s:6,j:1}
    
    
    
       //遍历 json对象取最大值
    
       for(var val in json){
    
         if(json[val]>iMax){
    
            iMax=json[val];
    
               icur=val;
    
         }
    
       }
    
    
    
       console.log('出现最多的字符:'+icur,'出现次数:'+iMax);       

    9.冒泡排序

    var arr= [12,34,56,23,4,74,2,33,21,54,19,13,14,16,50]
            function buttleSort (arr) {
                var len= arr.length;
                var  i = 0;
                for (; i < len;i++) {//递归循环
                    for (var j=0; j<len-i;j++) {
                        if (arr[j]>arr[j+1]) {
                            //交换位置
                            var term=arr[j];
                            arr[j]=arr[j+1];
                            arr[j+1]=term;
                        }
                    }
                }
                return arr
            }
            console.log(buttleSort (arr));
    • (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个位置。
    • (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    • (3)针对所有的元素重复以上的步骤,除了最后一个。
    • (4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
     

    10.快速排序

    var array = [1,4,-8,-3,6,12,9,8];
    function quickSort(arr){
    //如果数组长度小于等于1,则返回数组本身
        if(arr.length<=1){
            return arr;
        }
        //定义中间值的索引
        var index = Math.floor(arr.length/2);
        //取到中间值
        var temp = arr.splice(index,1);
        //定义左右部分数组
        var left = [];
        var right = [];
        for(var i=0;i<arr.length;i++){
        //如果元素比中间值小,那么放在左边,否则放右边
            if(arr[i]<temp){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
        return quickSort(left).concat(temp,quickSort(right));
    }
    document.write(quickSort(array));
    //
    递归思想,两边快速的排序,冒泡排序的改进

    Math.floor(x)方法是向下取整,返回小于或等于x的最接近的整数。

    splice(index,num,item)方法是向数组中添加项目,或是从数组中删除项目,并返回被删除的项目。

    • index是整数,被操作项目所在的位置(必须)
    • num是整数,要删除的项目的数量,如果为0,表示不删除(必须)
    • item是向数组中添加的新项目,可以是多个(可选)

    push()方法是向数组末尾添加一个或多个新项目并返回新数组的长度

    concat()方法连接两个或多个数组,不会改变原有数组,返回一个新数组

    
    

     11.插入排序

    var array = [1,4,-8,-3,6,12,9,8];
    function insertSort(arr){
    //假设第0元素是有序序列,第1元素之后是无序的序列。从第1元素开始依次将无序序列的元素插入到有序序列中
        for(var i=1; i<arr.length;i++){
            if(arr[i]<arr[i-1]){
                //取出无序序列中需要插入的第i个元素
                var temp = arr[i];
                //定义有序中的最后一个位置
                var j = i-1;
                arr[i] = arr[j];
                //比较大小,找到插入的位置
                while(j>=0&&temp<arr[j]){
                    arr[j+1] = arr[j];
                    j--;
                };
                //插入
                arr[j+1] = temp;
            }
        }
      }
    insertSort(array)
    document.write(array);
    (1)从第一个元素开始,该元素可以认为已经被排序
    (2)取出下一个元素,在已经排序的元素序列中扫描
    (3)如果该元素(已排序)大于新元素,将该元素移到下一位置
    (4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    (5)将新元素插入到下一位置中
    (6)重复步骤2

    12. 选择排序

    var array = [1,4,-8,-3,6,12,9,8];
    function selectSort(arr){
        for(var i=0;i<arr.length;i++){
            //设置当前范围最小值和索引
            var min = arr[i];
            var minIndex = i;
            //在该范围选出最小值
            for(var j=i+1;j<arr.length;j++){
                if(min>arr[j]){
                    min = arr[j];
                    minIndex = j;
                }
            }
            //将最小值插入,并将原来位置的最小值删除
            arr.splice(i,0,min);
            arr.splice(minIndex+1,1);
        }
    }
    selectSort(array);
    document.write(array);
    (1)在未排序序列中找到最小(大)元素
    (2)并存放到排序序列的起始位置
    (3)然后,再从剩余未排序元素中继续寻找最小(大)元素
    (4)然后放到已排序序列的末尾。
    (5)以此类推

    13.寻找两个有序数组最小相同元素

    const a = [1, 2, 5, 9, 10]
    const b = [3, 4, 6, 9, 10]
    
    function findElement (a, b) {
        let i = j = 0
        while (i < a.length || j < b.length) {
            if (a[i] === b[j]) {
                return a[i]
            } else if (a[i] > b[j]) {
                j ++
            } else if (a[i] < b[j]) {
                i ++
            }
        }
        return null
    }
    
    console.log(findElement(a, b))
    // => 9
  • 相关阅读:
    人脸识别完整项目实战(1):目录大纲篇
    《分布式数据仓库最佳实践》学员答疑实录(2)
    知识图谱完整项目实战(附源码)(3)
    人脸识别完整项目实战(14):实时人脸特征点标定程序设计
    知识图谱完整项目实战(附源码)(2)
    sqlserver查询数据表中每个分类最新的一条记录
    WPF datagrid combobox 使用枚举
    中控考勤机开发-专业性门禁终端
    临时保存
    开源WPF控件库MaterialDesignInXAML推荐
  • 原文地址:https://www.cnblogs.com/Jade-Liu18831/p/9595748.html
Copyright © 2020-2023  润新知