奇偶换位问题

medie2005 2007-12-03 08:07:42
加精
这个题是在C++版看到的,mathe作了解答,不过很有意思,发上来大家讨论讨论。

问题:一长度为2n的int的数组A[],其元素分布为:
A[0], A[1], ..., A[2n-1]
试用O(n)的时间、O(1)的空间将它变为:
A[0], A[2], ..., A[2n-2], A[1], A[3], ..., A[2n-1]
...全文
3781 56 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
r444444 2008-12-30
  • 打赏
  • 举报
回复
很难,很复杂
BusyCai 2008-10-15
  • 打赏
  • 举报
回复
mark
三翔馆主 2008-10-02
  • 打赏
  • 举报
回复
mark
wzyzb 2008-09-14
  • 打赏
  • 举报
回复
mark
jessekyypig 2008-09-13
  • 打赏
  • 举报
回复
C++/C code 简单测试了一下

class Queue
{
public:
int front;
int rear;
char data[5];
public:
Queue(){front=rear=0;}
void Enqueue(char ch)
{
data[rear++]=ch;
if(rear==5)rear=0;
}

char Dequeue()
{
char ch=data[front++];
if(front==5) front=0;
return ch;
}
};

int main()
{

Queue q;
char X[]="abcdefgh";//测试数据
int n=strlen(X)/2;int flag=1;int j=0,i;
for(i=1;i<2*n-1;i++)
{
if(flag==1)
{
if(i<=n-1)q.Enqueue(X[i]);
X[i]=X[n+j];
j++;
flag=0;
}
else
{
if(i<=n-1)q.Enqueue(X[i]);
X[i]=q.Dequeue();
flag=1;

}
}
cout<<X;
return 0;
}
rczjp 2008-07-25
  • 打赏
  • 举报
回复
你们有点猛...
kdliang031220 2008-07-24
  • 打赏
  • 举报
回复
zambertcdsn 2008-07-18
  • 打赏
  • 举报
回复
test&mark
yhlevin 2008-07-12
  • 打赏
  • 举报
回复
mark
Gob00st 2008-07-02
  • 打赏
  • 举报
回复
mark
wzyzb 2008-06-20
  • 打赏
  • 举报
回复
学习 了 你们都很强
cqqqq 2008-06-16
  • 打赏
  • 举报
回复



A[0] A[1] A[2] A[3] A[4] A[5] ... A[2n-4] A[2n-3] A[2n-2] A[2n-1]

交换元素A[1] A[2] ;A[2n-3] A[2n-2] 后


A[0] A[2] A[4] ... A[2n-4] A[2n-2] | A[1] A[3] A[5] ... A[2n-3] A[2n-1]

0 1 2 3 | 4 5 6 7 2n-1=7 n=4
hjb719 2008-04-30
  • 打赏
  • 举报
回复
mark
l007i 2008-04-09
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "stdlib.h"
#include "time.h"

int location( int k,int m)
{
if ( k>=m ) return 2*(k%m)+1;
return 2*(k%m);
}

int main(int argc,char *argv[])
{
int temp,index=1,free=1,i=1,max=2,M=9,newL;
int arr[2*9] = {11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29};
temp = arr[1];

while(i++<=2*M-2)
{
if( index<M && index == max ) max = index+1;

newL = location(index,M) ;

if( ( location(newL,M) == free ) )
{
arr[free] = arr[newL];
arr[newL] = temp;

index = max;
temp = arr[index];
free = index;
i++;

}
else
{
arr[free] = arr[newL];
arr[newL] = temp;
temp = arr[free];
index = newL;
}
}

for(int i=0;i<2*M;i++)
printf("%5d",arr[i]);

system("pause");

}
l007i 2008-04-09
  • 打赏
  • 举报
回复
int location( int k,int m)
{
if ( k>=m ) return 2*(k%m)+1;
return 2*(k%m);
}

int main(int argc,char *argv[])
{
int temp,index=1,free=1,i=1,max=2,M=4,newL;
int arr[2*4] = {11,12,13,14,21,22,23,24};
temp = arr[1];

while(i++<=2*M-2)
{
if( index<M && index == max ) max = index+1;

newL = location(index,M) ;

if( ( location(newL,M) == free ) )
{
arr[free] = arr[newL];
arr[newL] = temp;

index = max;
temp = arr[index];
free = index;
i++;

}
else
{
arr[free] = arr[newL];
arr[newL] = temp;
temp = arr[free];
index = newL;
}
}

for(int i=0;i<2*M;i++)
printf("%5d",arr[i]);

system("pause");

}
yaos 2008-02-08
  • 打赏
  • 举报
回复
int a[2n];
int i = 1;
int p;
int temp = a[0];
a[0] = a[1];
while (true)
{
if (i % 2)
p = (i + 2n - 1) / 2
else
p = i / 2;
a[i] = a[p];
a[p] = a[0];
a[0] = a[i];
i = p;
if (p = 1) break;
}
a[0] = temp;
上面的存在问题
修改下
yaos 2008-02-08
  • 打赏
  • 举报
回复
假设2n个
比如10
0 1 2 3 4 | 5 6 7 8 9

0 2 4 6 8 | 1 3 5 7 9

1 -> 5
5 -> 7
7 -> 8
8 -> 5
4 -> 2
2 -> 1

假设当前位置为x x从零开始 总共2n个位置
则移动到位置p
if even(x) p = x / 2
if odd(x) p = (x + 2n - 1) / 2

int a[2n];
int i = 1;
int p;
int temp = a[0];
a[0] = a[1];
while (i <> 1)
{
if (i % 2)
p = (i + 2n - 1) / 2
else
p = i / 2;
a[i] = a[p];
a[p] = a[0];
a[0] = a[i];
i = p;
}
a[1] = a[0];
a[0] = temp;

不知道这个能正确移动么?



jmulxg 2008-01-28
  • 打赏
  • 举报
回复
MARK
rodney1983 2008-01-16
  • 打赏
  • 举报
回复
mark
shdongsichyang 2008-01-09
  • 打赏
  • 举报
回复
markvv
加载更多回复(36)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧