问题
已知在一维数组A[m+n]中一次存放两个线性表(a1,a2,a3...am)
和(b1,b2,b3,...,bn)
。
现要求将数组中的两个顺序表的位置互换,即将(b1,b2,b3,...,bn)
放到(a1,a2,a3...am)
的前面。
输入样例:
2 3
1 2 3 4 5
输出样例:
3 4 5 1 2
思路
只需要反转3次即可
1. 将整个数组反转得到bn,bn-1,...,b1,am,am-1,...,a1
2. 之后将bn到b1段倒置得到b1,b2,...,bn
3. 最后将am到a1段倒置得到a1,...,am)
C语言
#include <stdio.h>
#include <stdlib.h>
void Reverse(int left, int right, int* arr) {
for (int i = left, j = right; i <= (left + right) / 2; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int main() {
int m, n;
scanf("%d%d", &m, &n);
int len = m + n;
int* arr = (int*)malloc(sizeof(int) * len);
for (int i = 0; i < len; i++)
{
scanf("%d", &arr[i]);//(得到a1,a2,...,am,b1,b2,..,bn)
}
Reverse(0, len-1, arr);//首先将整个序列倒置(得到bn,bn-1,...,b1,am,am-1,...,a1)
Reverse(0, n - 1, arr);//之后将bn到b1段倒置(得到b1,b2,...,bn)
Reverse(n, len - 1, arr);//最后将am到a1段倒置(得到a1,...,am);
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}