面试机试小程序之数组合并
有两个升序的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]);
}
}
}
很直观的思维,用代码表现出来即可,就是不知道当时怎么了,没仔细看题,先入为主,一下楼反而思维清晰了。
当然,两个无序的数组,合并,并排序,这个倒是可以留着锻炼一下思维。