面試時常遇到的數組面試題

1.計算給定數組 arr 中全部元素的總和 json

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,結果返回新的數組ui

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 數組上進行操做,並將結果返回spa

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

(二)code

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

(四)blog

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
相關文章
相關標籤/搜索