陣列的一些面試題

weixin_34253539發表於2018-07-19

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))

相關文章