数组的循环左移

Posted wudikzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组的循环左移相关的知识,希望对你有一定的参考价值。

设将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;
}

 














































以上是关于数组的循环左移的主要内容,如果未能解决你的问题,请参考以下文章

数组循环左移p位

数组的循环左移

在 C 中使用两个指针左移/右移一个数组

习题2.2 数组循环左移(20 分)浙大版《数据结构(第2版)》题目集

Java数列循环左移

算法习题---线性表之数组实现循环移动