计蒜客-顺序表的循环左移

问题描述

对于顺序表 L=(a_0, a_1, ..., a_{n-1}),循环左移 k 位意味着将顺序表变为 L^k=(a_k, a_{k+1}, ..., a_{n-1}, a_0, a_1, ..., a_{k-1})。

比如:长度为 8 的顺序表 (1, 2, 3, 4, 5, 6, 7, 8),循环左移 3 位后的结果为 (4, 5, 6, 7, 8, 1, 2, 3)。

输入格式

第一行输入两个整数 n(1 <= n <= 100) 和 k(0 ≤ k ≤ n),分别表示顺序表的元素个数和循环左移的位移量。

第二行一共 n 个整数 ai​(0 ≤ ai​ ≤ 10000),表示顺序表中元素的值。

输出格式 

输出只有一行,输出 n 个整数,顺序输出循环左移后顺序表中每个元素的值,每个元素之间用一个空格分隔。行末不要有多余空格。

样例输入

8 3
1 2 3 4 5 6 7 8

样例输出

4 5 6 7 8 1 2 3

源代码

#include<iostream>
using namespace std;
#define MaxSize 100

//定义一个长度为100的顺序表
typedef struct{
	int data[MaxSize];  //顺序表的元素
	int length;   //顺序表的当前长度
}SqList; 

bool ListInsert(SqList &L,int i,int e)  //将值为e的元素插入到L的第i个位置
{
	if(i<1||i>L.length+1)  //判断i的范围是否有效
	    return false;
	if(L.length>=MaxSize)  //当前存储空间已满,不能插入
	    return false;
	for(int j=L.length;j>=i;j--)  //将第i个元素及之后的元素后移
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;  //在位置i处放入e
	L.length++;     //线性表长度加1
	return true;
}

bool ListLoop(SqList &L,int move)  //将L循环左移move个单位
{

//被注释的部分是我开始的一种写法,其中第一个for循环是先让L.length增加move个长度后,
//将顺序表L的前move个元素依次插入到表尾,因此顺序表变为1 2 3 4 5 6 7 8 1 2 3;
//第二个for循环是将整个顺序表往前移动move位,顺序表变为4 5 6 7 8 1 2 3,再将L.length
//减少move个长度。这种写法对于题中样例没有问题,可是一旦输入数字变多,输出就不正常,
//想了半天不知道问题出在哪里,所以换一种写法。
    
    /*L.length+=move;
	for(int j=1;j<=move;j++)
	{
		ListInsert(L,L.length-move+1,L.data[j-1]);
	}
	for(int j=1;j<(L.length-move);j++)
	{
 	 L.data[j-1]=L.data[j-1+move];
	}
	L.length-=move;*/
	
//新的写法:第一个for循环,将L复制到新顺序表M中;第二个for循环,将M中的元素对应地赋值给L
	SqList M;
	M.length=L.length;
	for(int i=1;i<=L.length;i++)
	M.data[i-1]=L.data[i-1];
	for(int i=0;i<=L.length-1;i++)
	{
		L.data[i]=(M.data[(i+move+L.length)%L.length]);
	}
}


int main()
{
	SqList L;
	L.length=0;
	int num,move,shuru;
	cin>>num>>move;
	for(int i=1;i<=num;i++)
	{
		cin>>shuru;
		ListInsert(L,i,shuru);
	}
	ListLoop(L,move);
	for(int i=0;i<num-1;i++)
	cout<<L.data[i]<<" ";
	cout<<L.data[num-1]; //如果这里不这么写,输出最后一个数字后面还有一个空格,
                         //计蒜客系统就判定我格式错误,所以稍微改了一下
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值