大神们帮我看个程序,数组的循环移位,试了几组数据都没问题,在OJ一提交就会显示Time Limit Exceeded !
题目:ProblemDescription数组的循环移位,给一个数组,再给个数m,对数组进行循环左移m位,输出Input输入数据有多组,每组第一行是两个数字n(0<=N<...
题目:
Problem Description
数组的循环移位,给一个数组,再给个数m,对数组进行循环左移m位,输出
Input
输入数据有多组,每组第一行是两个数字n(0<=N<=500),m(m>=0),n表示数组长度,m表示数组要向左移m位.接下去一行有n个数;
Output
对每组输入数据,输出一行;
数之间有一个空格,行末没有空格
Sample Input
5 2
1 2 3 4 5
7 3
1 2 3 4 5 6 7
Sample Output
3 4 5 1 2
4 5 6 7 1 2 3
我的程序:
#include<stdio.h>
main()
{ int m,n; int ysz[600],i; int xsz[600],x,y,j,k,h;
while(EOF!=scanf("%d",&n))
{ scanf("%d",&m);
for(i=0;i<n;i++)
scanf("%d",&ysz[i]);
while(m>n)
m=m-n;
j=n-m-1;
for(x=0;x<=j;x++)
xsz[x]=ysz[x+m];
h=j+1;
for(k=j+1;k<n;k++)
xsz[k]=ysz[k-h];
printf("%d",xsz[0]);
for(i=1;i<n;i++)
printf(" %d",xsz[i]);
printf("\n");
}
} 展开
Problem Description
数组的循环移位,给一个数组,再给个数m,对数组进行循环左移m位,输出
Input
输入数据有多组,每组第一行是两个数字n(0<=N<=500),m(m>=0),n表示数组长度,m表示数组要向左移m位.接下去一行有n个数;
Output
对每组输入数据,输出一行;
数之间有一个空格,行末没有空格
Sample Input
5 2
1 2 3 4 5
7 3
1 2 3 4 5 6 7
Sample Output
3 4 5 1 2
4 5 6 7 1 2 3
我的程序:
#include<stdio.h>
main()
{ int m,n; int ysz[600],i; int xsz[600],x,y,j,k,h;
while(EOF!=scanf("%d",&n))
{ scanf("%d",&m);
for(i=0;i<n;i++)
scanf("%d",&ysz[i]);
while(m>n)
m=m-n;
j=n-m-1;
for(x=0;x<=j;x++)
xsz[x]=ysz[x+m];
h=j+1;
for(k=j+1;k<n;k++)
xsz[k]=ysz[k-h];
printf("%d",xsz[0]);
for(i=1;i<n;i++)
printf(" %d",xsz[i]);
printf("\n");
}
} 展开
2个回答
展开全部
/*
法1:每次将数组向右移动一位,移动k次
时间复杂度:O(k*n)
空间复杂度:O(1)
*/
void rightShift1(int a[], int n, int k)
{
k=k%n;
while(k--)
{
int t=a[n-1];
for(int i=n-1;i>0;i--)
a[i]=a[i-1];
a[0]=t;
}
}
/*
法2:借助一个辅助数组
时间复杂度:O(n)
空间复杂度:O(n)
*/
void rightShift2(int a[], int n, int k)
{
int b[n]; //这种初始化不规范
k=k%n;
for(int i=0;i<k;i++)
b[i]=a[n-k+i];
for(int i=0;i<n-k;i++)
b[k+i]=a[i];
for(int i=0;i<n;i++)
a[i]=b[i];
}
//反转
void reverse(int a[], int sta, int end) //左开右闭区间 [sta,end)
{
end-=1;
while(sta<end)
{
int t=a[sta];
a[sta]=a[end];
a[end]=t;
sta++;
end--;
}
}
/*
法3:巧妙利用反转 Orz
时间复杂度:O(n)
空间复杂度:O(1)
*/
void rightShift3(int a[], int n, int k)
{
k=k%n;
reverse(a, 0, n-k);
reverse(a, n-k, n);
reverse(a, 0 , n);
}
展开全部
说明你的算法复杂度太高了 。。。 TLE是超时啊 亲
while(m>n) m-=n; 这里为什么不用取余%去处理??? 假设的数据 2 1000000 问你超不超时
while(m>n) m-=n; 这里为什么不用取余%去处理??? 假设的数据 2 1000000 问你超不超时
更多追问追答
追答
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 666;
int num[MAXN];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i = 0;i < n;i++)
scanf("%d",&num[i]);
m = m%n;
int first = 1;
for(int i = m;first || i != m;i = (i+1)%n)
if(first)
{
printf("%d",num[i]);
first = 0;
}
else printf(" %d",num[i]);
puts("");
}
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询