美文网首页
面试题5(相关题目)

面试题5(相关题目)

作者: 打工这件小事 | 来源:发表于2018-11-06 22:19 被阅读0次

《剑指offer》面试题5:相关题目

题目:有2个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,请实现一个函数,把A2中的所有数字插入到A1中,并且数组整体有序。

思路:从后往前遍历数组,例如数组A1={5,7,9,10,null,null,null,null...},数组A2={1,2,3,8},
A1的长度是n,有值部分的长度是len1=4,A2长度是len2=4。准备2个指针:p1和p2,p1指向A1有值部分的末尾(p1=3),p2指向A2末尾(p2=3),比较2指针指向的数的大小,如果p1指向的数大于或等于p2指向的数(例如:10>8),则将p1指向的数复制到数组A1的第p1+p2+1位上,然后p1左移一位;如果p1指向的数小于p2指向的数(例如:7<8),则将p2指向的数复制到数组A1的第p1+p2+1位上,然后p2左移一位。重复比较移动的过程,当p2越界(A2已遍历完)时,数组A1已整体有序;当p1越界(A1已遍历完)时,需要把数组A2的剩余部分拷贝至A1的头部,然后数组就A1是整体有序的。

代码如下:

public Integer[] merge(Integer[] arr1,Integer[] arr2) {
    if (arr1 == null && arr2 != null) {
        return arr2;
    }
    if (arr1 != null && arr2 == null) {
        return arr1;
    }
    if (arr1 == null && arr2 == null) {
        return null;
    }
    int len1 = 0;
    for (int i = 0;i < arr1.length;i++) {
        if (arr1[i] != null) {
            len1++;
        }
    }
    int p1 = len1 - 1;
    int p2 = arr2.length - 1;
    while (p1 >= 0 && p2 >= 0) {
        if (arr1[p1] >= arr2[p2]) {
            arr1[p1 + p2 + 1] = arr1[p1--];
        } else {
            arr1[p1 + p2 + 1] = arr2[p2--];
        }
        while (p1 < 0 && p2 >= 0) {
            arr1[p2] = arr2[p2--];
        }
    }
    return arr1;
}

相关文章

网友评论

      本文标题:面试题5(相关题目)

      本文链接:https://www.haomeiwen.com/subject/xkupxqtx.html