面试机试小程序之数组合并

有两个升序的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]);

       }

}

}

很直观的思维,用代码表现出来即可,就是不知道当时怎么了,没仔细看题,先入为主,一下楼反而思维清晰了。

当然,两个无序的数组,合并,并排序,这个倒是可以留着锻炼一下思维。

 

posted @ 2018-08-14 15:13  ergexy  阅读(1456)  评论(0编辑  收藏  举报