有兩個升序的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]);
}
}
}
很直觀的思維,用代碼表現出來即可,就是不知道當時怎么了,沒仔細看題,先入為主,一下樓反而思維清晰了。
當然,兩個無序的數組,合並,並排序,這個倒是可以留着鍛煉一下思維。
