数组的循环左移

描述

设将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中所存放的序列。每两个数之间用空格分隔。

样例输入1 复制

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

样例输出1

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

 

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

时间: 2024-10-16 22:04:59

数组的循环左移的相关文章

《编程珠玑》笔记:数组循环左移

问题描述:数组元素循环左移,将包含 num_elem 个元素的一维数组 arr[num_elem] 循环左移 rot_dist 位.能否仅使用数十个额外字节的存储空间,在正比于num_elem的时间内完成数组的旋转? 一:Bentley's Juggling Alogrithm 移动变量 arr[0] 到临时变量 tmp,移动 arr[rot_dist] 到 arr[0],arr[2rot_dist] 到 arr[rot_dist],依此类推,直到返回到取 arr[0] 中的元素,此时改为从 t

从数组循环左移问题中浅谈考研算法设计的规范代码

问题:设将n(n>1)个整数存放到一维数组R中.设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,...,Xn-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1}.要求:写出本题的算法描述. 分析: 本题不难,要实现R中序列循环左移p个位置,只需先将R中前p个元素逆置,再将剩下的元素逆置,最后整体逆置操作即可.本题算法描述如下: 1 #include <iostream> 2 using namespace st

数组循环左移p位

逆置前p个元素,再逆置剩下的元素,再逆置全部 测试数组:1 2 3 4 5 6 如:循环左移3位 3 2 1 6 5 4 4 5 6 1 2 3 法2:从0开始,下标-p,如果小于0,再加数组长度n,将0的值放入该下标 测试数组:1 2 3 4 5 如:循环左移3位 下标0:0-3+6=3 原文地址:https://www.cnblogs.com/dubuyunjie/p/12184364.html

字符串循环左移

输入一个字符串和一个非负整数N,要求将字符串循环左移N次. 输入格式: 输入在第1行中给出一个不超过100个字符长度的.以回车结束的非空字符串:第2行给出非负整数N. 输出格式: 在一行中输出循环左移N次后的字符串. 输入样例: Hello World! 2 输出样例: llo World!He #include<stdio.h>#include<string.h> int main(){ char s[101],s2[101];  int n;  gets(s);  char *

经典面试题 之 数组的循环右移

经典面试题 之 数组的循环右移 题目的大意是将一个长度为n的数组A内的元素循环右移m位(当然左移也可以),比如数组 {1, 2, 3, 4, 5}右移3位之后就变成{3, 4, 5, 1, 2}. 这题最平凡的做法是开另一个大小一样的数组B,遍历一下,令B[(i + m) % n] = A[i],再将B的内容写回到A即可.这个方法的时间复杂度为O(N),空间复杂度也为O(N). 很明显,需要优化空间的使用.有一种很优美但不太好懂的方法,是先将A的元素倒置,即{1, 2, 3, 4, 5}变成{5

7-31 字符串循环左移(20 分)

7-31 输入一个字符串和一个非负整数N,要求将字符串循环左移N次. 输入格式: 输入在第1行中给出一个不超过100个字符长度的.以回车结束的非空字符串:第2行给出非负整数N. 输出格式: 在一行中输出循环左移N次后的字符串. 输入样例: Hello World! 2 输出样例: llo World!He AC代码 #include<stdio.h> #define max 105 int main(){ char s;//指单独一个字符 char t[max];//创建一个字符数组 int

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

一:问题 设将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即把R中的数据序列由(x0,x1,…,xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,x). 二:思考 要实现R中序列循环左移P个位置,只需先将R中前P个元素逆置,再将剩下的元素逆置,最后将R中所有的元素再整体做一次逆置操作即可,本题算法描述如下: (一)步骤一:将前P个元素逆置 (二)步骤二:将后P个元素逆置 (三)步骤三:

循环左移

设将n(n>1)个整数存放到一位数组R中,设计一个算法,将R中的序列循环左移P(0<P<n)个位置,即将R中数据由{X0,X1,....,Xp-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1} 要实现R中序列循环左移P个位置,只需先将前P个元素逆置,再将剩下的元素逆置,最后将R中的所有元素逆置即可 #include <iostream> #define N 50 using namespace std; void reverse(int R[],i

Java数列循环左移

描述 有n个整数组成一个数组(数列).现使数列中各数顺序依次向左移动k个位置,移出的数再从尾部移入.输出移动后的数列元素. 题目没有告诉你n的范围,要求不要提前定义数组的大小. 另外要求定义并使用函数LeftShift() void LeftShift(int *a, int n, int k) { //循环移动后的数值仍然存入数组a中 } 输入 输入分2行,第一行是两个整数n和k.第二行是n个整数.数据用','隔开. 输出 输出有一行,是循环左移后的n个整数,由','隔开. 难度 中等 输入示