剑指offer 面试题5 替换空格 扩展

题目:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,将A2中的所有数字插入A1中,并且所有的数字是排序的。(时间复杂度O(n))

输入A1={1,3,5,7,9},A2={2,4,6,8,10}

则输出A1={1,2,3,4,5,6,7,8,9,10}

//  测试用例
//  test1  len1 > len2  eg : A1 = { 1, 2, 10, 11, 20, 21 }; A2 = { 3, 5, 15, 25 };
//  test2  len1 < len2  eg : A1 = { 3, 5, 15, 25 }; A2 = { 1, 2, 10, 11, 20, 21 };
//  test3  len1=len2  eg: A1={ 1, 3, 5, 7, 9 }; A2={ 2, 4, 6, 8, 10 };
#include<iostream>

using namespace std;

void combineArray(int A1[], int A2[], int len1, int len2)
{
	if ((A1 == nullptr) || (A2 == nullptr) || (len1 <= 0) || (len2 <= 0))
		return;
	int i = len1 - 1;
	int j = len2 - 1;
	int k = len1 + len2 - 1;
	while ((i >= 0) && (j >= 0))
	{
		if (A1[i] > A2[j])
			A1[k] = A1[i--];
		else
			A1[k] = A2[j--];
		k--;
	}
	//  如果A1有元素剩余(即:i>=0),将其依次拷贝到A1的前端(A1不需要再次拷贝,无须此操作)
	//while (i >= 0)
	//{
	//	A1[k--] = A1[i--];
	//}
	
	//  如果A2有元素剩余(即:j>=0),将其依次拷贝到A1的前端
	while (j >= 0)         
	{
		A1[k--] = A2[j--];
	}
	for (int index = 0; index < len1 + len2; index++)
		cout << A1[index] << " ";
}

int main()
{
	int A1[100] = { 1, 3, 5, 7, 9 };
	int A2[] = { 2, 4, 6, 8, 10 };
	combineArray(A1, A2, 5, 5);
	cout << endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/lizhentao0707/article/details/80325321