面試機試小程序之數組合並


有兩個升序的int型數組 a{1,4,7,12,23,25} b{5,10,11,14,27,29,34},要求合並數組,並保持升序,注意代碼效率,時間復雜度和內存。

當時要求手寫實現,由於剛上來未注意到升序,寫了一個數組合並,並對數組進行冒泡排序的算法,后來面試官一看,效率和時間復雜度不行,想要更優雅的方法,其實也非常簡單,只是當時想寫一個獲取兩個數組最小數的方法getArrMinNum(a,b),獲取a中最小數,並記錄下標,然后再跟b中的數字做比較,取到a,b中的最小數以及坐標,然后再怎么循環數組,略過數組下標的混亂思維里了。仔細觀察,如果a[a.length-1]<b[0],那好辦,兩個數組一連就ok了,如果a[i]<b[0],那么把0-i的值都放入新數組,然后再放入b[0],然后再判斷a[i]與b[1]的大小,然后執行上個放入,如果最后a[length-1]>b[length-1],表示數組放置完畢,否則,把b剩下的數組依次放入新數組即可。

public class ArrTest{

public static void main(String[] args){      

   int[] a={1,4,7,12,23,25}, b={5,10,11,14,27,29,34};

  ArrTest  arrTest = new ArrTest();

  arrTest .mergeArr(a,b);

}

public void mergeArr(int[] a,int[] b){

  int aLength = a.length,bLength = b.length;

  int[] arr = new int[aLength+bLength];

  int arrIndx=0,bIndex=0;

  if(a[aLength-1]<b[0]){

    for(int i=0;i<aLength;i++){

      arr[arrIndex]=a[i]; 

      arrIndex++;

         }

    for(int i=0;i<bLength;i++){

      arr[arrIndex]=b[i]; 

      arrIndex++;

         }

    print(arr);

   }else{

    for(int i=0;i<aLength;i++){

      if(a[i]<b[bIndex]){

        arr[arrIndex]=a[i];

        arrIndex++;

      }else{

        i--;

        arr[arrIndex]=b[bIndex];

        arrIndex++;

        bIndex++;

      }

    }

         while(bIndex<bLength){

      arr[arrIndex]=b[bIndex];

      arrIndex++;

      bIndex++;

    }

    print(arr);

  }

}

public void printArr(int[] arr){

  for(int i=0;i<arr.length;i++){

     System.out.println(arr[i]);

       }

}

}

很直觀的思維,用代碼表現出來即可,就是不知道當時怎么了,沒仔細看題,先入為主,一下樓反而思維清晰了。

當然,兩個無序的數組,合並,並排序,這個倒是可以留着鍛煉一下思維。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM