大神们帮我看个程序,数组的循环移位,试了几组数据都没问题,在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");

}

}
展开
 我来答
子华粉丝
2019-09-08 · TA获得超过461个赞
知道答主
回答量:138
采纳率:66%
帮助的人:48.7万
展开全部
/*
法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);
}
百度网友c17d5fab2
2013-11-03 · 超过53用户采纳过TA的回答
知道小有建树答主
回答量:137
采纳率:0%
帮助的人:135万
展开全部
说明你的算法复杂度太高了 。。。 TLE是超时啊 亲
while(m>n) m-=n; 这里为什么不用取余%去处理??? 假设的数据 2 1000000 问你超不超时
更多追问追答
追问

这次直接成wrong anwser

追答
#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;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式