2012年UC的一道笔试题
在空间复杂度O(1),时间复杂度O(n)下,置换数组
a1, a2, ..., an, b1, b2, ..., bn
置换后
在空间复杂度O(1),时间复杂度O(n)下,置换数组
a1, a2, ..., an, b1, b2, ..., bn
置换后
a1, b1, a2, b2,..., an, bn
关于此题,一般我们的做法都是重新构造一个数组来进行操作,但与题中描述的空间复杂度O(1)不符,为了达到空间复杂度O(1),就必须充分利用原数组的空间,因而我使用的方法是迭代置换,具体代码如下:
#include <stdio.h>
#define N 10
int a[2 * N + 1];
int temp = 0, flag = 1;
void IterSwap(int index)
{
int t = index;
if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t]))
{
flag = 1;
return;
}
// 第一次迭代,暂存变量
if (flag)
{
temp = index;
flag = 0;
}
if (index % 2)
{
t = (index + 1) / 2;
if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t]))
{
a[index] = temp;
flag = 1;
return;
}
}
else
{
t = index / 2 + N;
if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t]))
{
a[index] = temp;
flag = 1;
return;
}
}
a[index] = a[t];
IterSwap(t);
}
int main()
{
int i;
for (i=1; i<=2 * N; ++i)
a[i] = i;
i = 2 * N - 1;
for (i = 2; i < 2 * N; ++i)
IterSwap(i);
for (i=1; i<=2 * N; ++i)
printf("%d ", a[i]);
printf("\n");
return 0;
}