美文网首页
数组的一些面试题

数组的一些面试题

作者: 从小就很瘦 | 来源:发表于2018-07-19 22:08 被阅读0次

1. 统计一个字符串中出现最多的字符。


        var str = 'wangxiaoaiwangxiaoting';
        var o = {};
        for(var i = 0; i < str.length; i++) {
            var char = str.charAt(i);
        // console.log(char);
            if(o[char]){     //obj.name 和 obj['name']
                o[char]++  //如果对象有这个属性了,就给这个属性自增1
        }else{
                o[char] = 1  //如果对象没这个属性,就个这个属性值设为1
            }
        }
        console.log(o);
        var num = 0;
        var number = '';
        for (var i in o) { //for in循环 遍历对象的属性和方法
            if(num < o[i]){
                num = o[i];
                number = i
            }
        }
        console.log('最多出现的字符是:'+number+','+'次数是'+num)

2. 数组去重的几种方法


var arr = [1,1,2,2,7,5,7,5,4,3,3,4,'a','c','a','b','c','b']
        //方法一:利用对象属性的存在的特性,如果没有该属性则存入数组
        function unique1(arr) {
            var res = [];
            var obj = {};
            for(var i = 0; i<arr.length; i++){
                if(!obj[arr[i]]){   //obj[arr[i]]为obj对象的属性值
                    obj[arr[i]] = 1;
                    res.push(arr[i])
                }
            }
            return res;
        }
        console.log(unique1(arr));

        //方法二:利用数组的indexOf
        function unqiue2(arr) {
            var res = [];
            for(var i = 0; i<arr.length; i++){
                if(res.indexOf(arr[i])==-1){  //或 arr.indexOf(arr[i])==i,即arr[i]第一次出现就push进res,再次出现就不符合条件,不再push。
                    res.push(arr[i])
                }
            }
            return res;
        }
        console.log(unqiue2(arr));

        //方法三:数组原型对象上的的includes方法
        function unique3(arr) {
            var res = [];
            for(var i = 0 ;i < arr.length; i++){
                if(!res.includes(arr[i])){
                    res.push(arr[i])
                }
            }
            return res;
        }
        console.log(unique3(arr));

        //方法四:排序后相邻去重 思路:原数组排序,排序后相同值相邻,然后遍历时新数组只传入不与前一个值相同的值
        function unique4(arr) {
            arr.sort();  //排序后arr已经改变了
            var res = [arr[0]];
            for(var i = 1; i<arr.length; i++){
                if(arr[i] !== res[res.length-1]){
                    res.push(arr[i])
                }
            }
            return res;
        }
        console.log(unique4(arr));

        //方法五:优化遍历数组
        function unique5(arr) {
            var res = [];
            for(var i = 0; i < arr.length; i++){
                for(var j = i+1; j < arr.length; j++){
                    if(arr[i] == arr[j]){
                         ++ i;  //与右边的元素依次比较,若有重复,则跳出内层循环,重新开始。
                        }
                    }
                    res.push(arr[i])
                }
                return res;
            }
            console.log(unique5(arr))

        //方法六:ES6 Set数据结构类似于数组,其成员都是唯一的 IE系列不兼容
        function unique6(arr) {
            // return Array.from(new Set(arr)) ;//Array.from 将Set结构转换成数组
            return [...(new Set(arr))]  
        }
        console.log(unique6(arr))

        //方法七:ES6 
        function unique7(arr) {
            const res = new Map();
            return arr.filter((a)=>!res.has(a)&&res.set(a,1))
        }
        console.log(unique7(arr));

3. 数组clone(深、浅拷贝)


        var arr1 = arr.concat();//方法1 concat(),深拷贝
        var arr2 = arr.slice(0);//方法2   slice(),深拷贝
        var arr3 = [];          //方法3   for循环,浅拷贝
        for(var i in arr){
            arr3[i] = arr[i]
        }
        /**
         * 深拷贝 ,如果数组里含有对象
         */
        function deepClone(arr) {
            var res = [];
            for (var i in arr){
                if (typeof arr[i] === 'object') { //如果含有对象,则递归
                    res[i] = deepClone(arr[i])
                }else{
                    res[i] = arr[i]
                }
            }
            return res
        }

4. 找出数组中的最大值


        var arrMax = [1,2,3,4,5];
        //1.for循环,古老的写法,遍历之后取最大值
        var arrRes = arrMax[0];
        for(var i = 1 ;i <arrMax.length; i++){
            var result = Math.max(arrRes,arrMax[i]) 
        }
        console.log(result)
        //2.Math最大值。用到apply方法,可以将数组转换成参数列表再调用Math方法
        Math.max.apply(null,arrMax)
        //3.sort()
        arrMax.sort((num1,num2) => {return num2-num1})[0] //或者sort()后reverse() 
        //4.reduce()
        arrMax.reduce((num1,num2) => {return num1 > num2 ? num1 : num2})

5. 数组降维


var arrDown = [[1,2,3],[4,5],[9,8,7]];
        //1.二维数组,双层遍历
        function down(arr) {
            var resDown = [];
            for(var i = 0;i < arr.length; i++){
                for (var j = 0; j < arr[i].length; j++){
                    resDown.push(arr[i][j])
                }
            }
            return resDown
        }
        console.log(down(arrDown))
        //2.concat()
        function down2(arr) {
            var resDown = [];
            for(var i = 0; i < arr.length; i++){
                resDown = resDown.concat(arr[i])
            }
            return resDown
        }
        console.log(down2(arrDown))
        //3.concat()和apply()结合
        function down3(arr) {
            var resDown = [];
            return Array.prototype.concat.apply(resDown,arr)
        }
        console.log(down3(arrDown))

6. 数组排序


        //1.冒泡排序
        var arrs = [3,2,5,9,1,6,33,4,65,22];
        var temp = 0;
        for(var i = 0; i < arrs.length; i++){
            for(var j = i+1; j < arrs.length;j++){ 
                 if(arrs[i] > arrs[j]){ //相邻比较,如果前一个大,就调换位置
                    temp = arrs[i];//temp储存前一个大的数
                    arrs[i] = arrs[j];//前一个换成小的那个数
                    arrs[j] = temp//将大的赋值给后一个
                }
            }
        }

        console.log(arrs)
        //2.快速排序
        function quickSort(arr) {
            if(arr.length <= 1) return arr;
            var middleIndex = Math.floor(arr.length/2);//取中间值
            var middle = arr.splice(middleIndex,1);//删除并返回这个值,即把中间这个值拿出来用作比较
            var left = [];
            var right = [];
            for(var i = 0; i < arr.length; i ++){
                if(arr[i] > middle){  //遍历,比这个大的放在right数组,小的放在left数组
                    right.push(arr[i])
                }else{
                    left.push(arr[i])
                }
            }
            return quickSort(left).concat(middle,quickSort(right));//递归 直到length<=1
        }
        console.log(quickSort(arrs));
        //3.选择排序
            function selectSort(arr) {
                var minIndex, temp;
                for(var i = 0; i < arr.length-1; i++){
                     minIndex = i;
                    for(var j = i+1; j<arr.length; j++){
                        if(arr[j] < arr[minIndex]){
                            minIndex = j
                        }
                    }
                    temp = arr[i];
                    arr[i] =arr[minIndex];
                    arr[minIndex] = temp;
                }
                return arr;
            }
            console.log(selectSort(arrs))

相关文章

  • 剑指offer面试题分类总结

    数组: 面试题3:数组中重复的数字面试题4:二维数组中的查找面试题21:调整数组顺序使奇数位于偶数前面面试题39:...

  • 剑指offer

    面试题3——数组中重复的数字 使用LinkedHashMap,有序存放。 面试题4——二维数组中的查找 首先选...

  • 手撕数组

    【面试题51:数组中重复的数字】 【面试题32:求从1到n的整数中1出现的次数】 【面试题33:把数组排成最小的数...

  • 数组的一些面试题

    说在前面的话:数组的concat,join,slice,toString方法不会改变原数组。数组的splice,p...

  • 数组的一些面试题

    1. 统计一个字符串中出现最多的字符。 2. 数组去重的几种方法 3. 数组clone(深、浅拷贝) 4. 找出数...

  • js数组面试题总结

    JS的一些面试题(数组篇) /Question:统计一个字符串中出现最...

  • JavaScript数组赋值引用及理解

    今天看到一道前端js面试题,加深了我对数组的一些理解。 var arr1 = 'edison'.split('')...

  • js数组题目

    js面试题 js数组 一、按要求分割数组 将"js,数组,分类"字符串数组以/分割 for循环累加 join()把...

  • 2.3.1 数组

    面试题3:数组中重复的数字 面试题4:二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一...

  • LeetCode | 面试题03. 数组中重复的数字【剑指Off

    LeetCode 面试题03. 数组中重复的数字【剑指Offer】【Easy】【Python】【数组】【哈希表】【...

网友评论

      本文标题:数组的一些面试题

      本文链接:https://www.haomeiwen.com/subject/ibyxmftx.html