PAT乙级1008

题目链接

https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808


查了查网上的题解,情况如下:

题解一

我这个方法应该是移了n+m次,看起来只用了一个数组,其实也是用了两个数组吧……惭愧惭愧

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
36
37
38
39
40
41
42
43
// PAT BasicLevel 1008
// https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808

#include <iostream>
using namespace std;

int main()
{
// 获取用户输入的n和m以及n个整数
int n,m;
int arr[200];
cin >> n >> m;
for(int i=0;i<n;i++){
cin >> arr[i];
}

// m==0则不用移动
if(m>0){
// 假如有10个数,右移13位其实相当于13%10=3位。
// 所以m一定小于n,所以把数组大小定义为200
m = m % n;

// 整体右移m位
for(int i=n-1;i>=0;i--){
arr[i+m]=arr[i];
}

// 把最右侧的m个数字循环右移到左侧
for (int i = n-1; i < n + m;i++){
arr[i%n]=arr[i];
}
}


// 输出结果
cout << arr[0];
for(int i=1;i<n;i++){
cout << ' ' << arr[i];
}

//system("pause");
return 0;
}

题解二

这道题的参考链接里说这是链表,讲错了吧,这儿哪有链表……核心在于三次逆置

但时间(3ms)与内存占用(400KB左右)和题解一差不多,可能测试用例输入规模不够大吧。

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
36
37
38
39
40
41
// PAT BasicLevel 1008
// httarrs://arrintia.cn/arrroblem-sets/994805260223102976/arrroblems/994805316250615808

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
// 获取用户输入的n和m以及n个整数
int n,m;
cin >> n >> m;
int* arr=new int[n];
for(int i=0;i<n;i++){
cin >> arr[i];
}

// m==0则不用移动
if(m>0){
// 假如有10个数,右移13位其实相当于13%10=3位。
// 所以m一定小于n,所以把数组大小定义为200
m = m % n;

// 三次逆置
reverse(arr, arr + n - m);
reverse(arr + n - m, arr + n);
reverse(arr, arr + n);
}


// 输出结果
cout << arr[0];
for(int i=1;i<n;i++){
cout << ' ' << arr[i];
}

//system("pause");

delete[] arr;
return 0;
}

作者:@臭咸鱼

转载请注明出处:https://chouxianyu.github.io

欢迎讨论和交流!