码迷,mamicode.com
首页 > 其他好文 > 详细

“举一反三”合并数组--《剑指offer》

时间:2014-05-22 06:14:10      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:c++   合并数组   

与上篇思想一样,或者说是替换数字的另一种版本吧,题目如下:

有两个已经排好的数组A1和A2,A1的末尾有足够的空间来容纳A2,我们将A2数组插入到A1中,继续保持已经排序

这样看来就和替换空格相似了,如果我们在A1数组从头到尾复制数字,这样导致A1数组后面的数一直不断往后移动,复杂度一样是O(n2),所以,我们来举一反三:

bubuko.com,布布扣

//2014-5-18
//举一反三,合并数组
#include <iostream>

using namespace std;

const int length = 50;

void MergeArray(int *arr1, int *arr2, int len1, int len2)
{
    if(arr2 == NULL || len1 + len2 > length || len2 < 1)
        return;

    for(int i = len1 + len2 - 1; i > len1 - 1 && len1 > 0; i--)  //与len1 - 1比较是为了防止无效复制,即复制自己
    {

        if(arr2[len2 - 1] > arr1[len1 - 1])
        {
            arr1[i] = arr2[len2 - 1];
            len2--;
        }
        else
        {
            arr1[i] = arr1[len1 - 1];
            len1--;
        }
    }
    if(len1 == 0)  //A2数组还有个别未复制成功
    {
        for(int i = 0; i < len2; i++)
            arr1[i] = arr2[i];
    }
}

void display(int *arr, int len)
{
    if(arr == NULL || len < 0)
        return;

    for(int i = 0; i < len; i++)
        cout << arr[i] << "  ";
    cout << endl;
}

int main()
{
    int *arr1 = new int[length];
    int *arr2 = new int[length];
    int len1 = 0, len2 = 0;
    cout << "请输入数组1的数据(-1结束):" << endl;
    int temp;
    cin >> temp;
    while(temp != -1)
    {
        arr1[len1++] = temp;
        cin >> temp;
    }

    cout << "请输入数组2的数据(-1结束):" << endl;
    cin >> temp;
    while(temp != -1)
    {
        arr2[len2++] = temp;
        cin >> temp;
    }

    MergeArray(arr1, arr2, len1, len2);

    display(arr1, len1 + len2);
    return 0;
}

测试1:

bubuko.com,布布扣

测试2:

bubuko.com,布布扣

测试3:

bubuko.com,布布扣

三个测试点分别为两个数组大小互相嵌套,A1数组数据<A2数组数据,A1数据>A2数据


O(∩_∩)O欢迎指教。。。

“举一反三”合并数组--《剑指offer》,布布扣,bubuko.com

“举一反三”合并数组--《剑指offer》

标签:c++   合并数组   

原文地址:http://blog.csdn.net/xjm199/article/details/26149891

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!