1、题目描述:
有两个排序数组 A1 和 A2,内存在 A1 的末尾有足够多的空余空间容纳 A2。请实现一个函数,把 A2 中的所有数字插入到 A1 中,并且所有的数字是排序的。
2、测试用例
3、解答思路
思路一:从头到尾扫描字符串,每次碰到空格字符的时候进行替换。但是由于是把1个字符替换成3个字符,就必须要把空格后面所有的字符后移2字节。
思路二:在合并两个数组(包括字符串)时,如果从前往后赋值每个数字(或字符),则需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。
复杂度分析:时间复杂度O(N^2)
代码如下:
#include <stdio.h>
#include <string.h>
void Unite_Arry(int *arrA, int *arrB, int len1, int len2)
{
//创建一个新的数组,用来存放重组后的元素
int arrC[30] = {0};
//arrC数组的长度
int len3 = len1 + len2;
int len = len3;
//入参判断
if(NULL == arrA || NULL == arrB || (len1-1) < 0 || (len2-1) < 0)
{
printf("The input parameter error!\n");
return;
}
//开始数组重组
while((len1-1) >= 0 && (len2-1) >= 0)
{
if(arrA[len1-1] >= arrB[len2-1])
{
arrC[lem3-1] = arrA[len1-1];
len1--;
len3--;
}
else
{
arrC[len3-1] = arrB[len2-1];
len2--;
len3--;
}
}
//当arrA数组的元素比arrB数组的元素多的时候,直接复制多出的元素到arrC的最前面
if(len1 > 0)
{
memcpy(arrC, arrA, len1*sizeof(int));
}
//当arrB数组的元素比arrA数组的元素多的时候,直接复制多出的元素到arrC的最前面
if(len2 > 0)
{
memcpy(arrC, arrB, len2*sizeof(int));
}
//输出重组的数组
int i;
printf("Reorganized arrC is:");
for(i=0;i<len;i++)
{
printf("%d ", arrC[i]);
}
printf("\n");
}
int main()
{
int arrA[] = {1,3,6,9,10};
int arrB[] = {0,1,2,12};
int n,m;
printf("Original arrA is:");
for(n=0; n<sizeof(arrA)/sizeof(int); n++)
{
printf("%d ", arrA[n]);
}
printf("\n");
printf("Original arrB is:");
for(m=0; m<sizeof(arrB)/sizeof(int); m++)
{
printf("%d ", arrB[m]);
}
printf("\n");
Unite_Arry((int*)arrA, (int*)arrB, sizeof(arrA)/sizeof(int), sizeof(arrB)/sizeof(int));
return 0;
}