请编写函数实现一个整数数组的循环右移,要求时间复杂度不能超过O(n)

空间复杂度尽量小,如1,2,3,4,5则循环右移两个元素后结果4,5,1,2,3右移和左移的详细代码或思路楼下那位怎么每次只是右移一位呢还有//以62为例,具体过程为//... 空间复杂度尽量小,如1,2,3,4,5则循环右移两个元素后结果4,5,1,2,3
右移和左移的详细代码或思路

楼下那位怎么每次只是右移一位呢还有
//以 6 2为例,具体过程为
// 3 2 1 4 5 6
//5 2 1 4 3 6
//5 4 1 2 3 6
//5 6 1 2 3 4、、这是循环右移2位结果吗
展开
 我来答
宁波祝老师
2008-11-07 · TA获得超过849个赞
知道小有建树答主
回答量:455
采纳率:100%
帮助的人:292万
展开全部
//楼主加点分吧,昨晚从12点半写到2点O(∩_∩)O....
#include <stdio.h>
#define N 60
int naddr=0,faddr=0,m,f=0;//naddr:当前要交换数据的游标号,faddr:即将移动到的游标号
#define swap(x,y,z){z=x,x=y,y=z;}//注意这里不是函数,是宏定义
void calculate()
{
faddr=(faddr+m)%N;
if(naddr==faddr)//自身交换
f=1;
}
void Init()
{
faddr=naddr=(naddr+1)%N;
calculate();
}
int main()
{
int k=0,a[N],t; //K 记录交换次数,宏观上要交换N-1次
for(t=0;t<N;t++)
a[t]=t+1;
scanf("%d",&m);
while(k<N-1)
{
calculate();
if(f)//出现自身与自身交换
{
Init();//赋新值
f=0;
k++;//注意这里,出现自身与自身交换的时候说明前面的交换过程正好完成一次循环,比如N=6时会出现5,2,1,4,3,6,
//这时 f(6)=f(3)+f(3)=2+2=4,即N=6时只要交换4次就足够了,同理可推广至其它情况:每出现一次循环就可以少交换一次。
}
swap(a[naddr],a[faddr],t)//交换数据
k++;
}
for(t=0;t<N;t++)
printf("%d ",a[t]);
printf("\n");
return 0;
}
//t和f其实只要一个就够了,如果确实需要节省这一个变量的空间,可以自己修改下
//采用交换的方法,时间和空间复杂度都是O(n);
//以 6 2为例,具体过程为
// 3 2 1 4 5 6
//5 2 1 4 3 6
//5 4 1 2 3 6
//5 6 1 2 3 4 这不是循环右移的结果???
怎么每次只是右移一位呢——不是右移一位啊,是每次把一个数据移动到正确位置,K每加1就有一个元素到达正确位置
钟全娄卯
2019-06-24 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:33%
帮助的人:859万
展开全部
//楼主加点分吧,昨晚从12点半写到2点O(∩_∩)O....
#include
#define
N
60
int
naddr=0,faddr=0,m,f=0;//naddr:当前要交换数据的游标号,faddr:即将移动到的游标号
#define
swap(x,y,z){z=x,x=y,y=z;}//注意这里不是函数,是宏定义
void
calculate()
{
faddr=(faddr+m)%N;
if(naddr==faddr)//自身交换
f=1;
}
void
Init()
{
faddr=naddr=(naddr+1)%N;
calculate();
}
int
main()
{
int
k=0,a[N],t;
//K
记录交换次数,宏观上要交换N-1次
for(t=0;t
评论
0
0
加载更多
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风清安有绸
2019-10-22 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:30%
帮助的人:1119万
展开全部
搜一下:请编写函数实现一个整数数组的循环右移,要求时间复杂度不能超过O(n)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式