码迷,mamicode.com
首页 > 编程语言 > 详细

数组的循环左移

时间:2018-11-06 01:03:41      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:bre   运算   style   while   swa   end   space   board   cout   

设将n(n>1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x0, x1…, xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。

多组数据,每组数据有三行。第一行为一个整数n,代表数组R中有n个元素。第二行为数组R中的n个元素(元素之间用空格分隔)。第三行为一个整数p,代表将R中的序列循环左移p个位置。当n等于0时,输入结束。

每组数据输出一行,为移动后的数组R中所存放的序列。每两个数之间用空格分隔。

 

 复制
5
1 2 3 4 5
1
6
-1 2 3 2 4 3
3
0
2 3 4 5 1
2 4 3 -1 2 3

思路:新开了一个数组来实现左移,计算公式类似于循环队列,采取取模的方法。本来也想过写swap函数,但感觉很麻烦。

#include<iostream>
using namespace std;

#define MAX 500

struct List
{
  int *elem;
  int length;
} ;

void in(List &L,int n)
{
  L.elem=new int[MAX];
  L.length=0;

  for(int i=0;i<n;i++)
  {
    L.length++;
    cin>>L.elem[i];
  }
}


void rev(List &L)
{
  int yi,temp[L.length];
  cin>>yi;//输入移动量

  for(int i=0;i<L.length;i++)
    temp[(i-yi+L.length)%L.length]=L.elem[i];//取模运算实现位移

  for(int i=0;i<L.length-1;i++)
    cout<<temp[i]<<" ";
  cout<<temp[L.length-1]<<endl;//系统要求最后输出的字符后面没空格,就这样实现了

}

 

int main()
{
  List L;
  int n;

  while(1)
  {
    cin>>n;
    if(n==0)
      break;//n=0退出
    in(L,n);
    rev(L);
  }
  return 0;
}

 

数组的循环左移

标签:bre   运算   style   while   swa   end   space   board   cout   

原文地址:https://www.cnblogs.com/WuDiKzl/p/9912377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!