B1008 数组元素循环右移问题 (20分)

字符串移位

1. 原文

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0 A1 ⋯ AN−1)变换为(AN−M ⋯ AN−1 A0 A1 … AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

1
2
6 2
1 2 3 4 5 6

输出样例:

1
5 6 1 2 3 4

2. 解析思路

将整体数组后移m位,将[nn+m-1]的数字与[0m-1]交换

3. AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
int num[1000];
int main(){
int n,m;
scanf("%d%d",&n,&m);
if (m>n)
{
m=m%n;
}
for (int i = 0; i < n; ++i)
{
scanf("%d",&num[i]);
}
//后移
for (int i = n+m-1; i >= m ; --i)
{
num[i]=num[i-m];
}
//交换
for (int i = 0; i < m; ++i)
{
num[i]=num[n+i];
}
//输出
for (int i = 0; i < n; ++i)
{
printf("%d",num[i]);
if(i<n-1){
printf(" ");
}else{
printf("\n");
}
}
return 0;
}
本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/06/B1008/
  • 发布时间: 2019-09-06 20:57
  • 更新时间: 2021-10-29 14:14
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!