PTA(顺序表)2-2 数组循环左移
PTA(顺序表)2-2 数组循环左移
zhangzhang2-2 数组循环左移
分数 6
作者 DS课程组
单位 浙江大学
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯a**n−1)变换为(a**m⋯a**n−1a0a1⋯a**m−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
1 | 8 3 |
输出样例:
1 | 4 5 6 7 8 1 2 3 |
我的答案(虽然是对的,但是有更好的,见后面)
1 |
|
思路核心是 “借助额外空间暂存前 m 个元素,再移动剩余元素”,整体逻辑能实现数组循环左移,但存在空间利用冗余和潜在逻辑漏洞,以下是思路总结、问题分析及优化建议:
一、核心思路总结
- 空间设计:初始化长度为
m+n的顺序表,用额外的m个空间暂存左移时要 “挪到末尾” 的前m个元素。 - 两步移动:
- 第一步:把原数组前
m个元素复制到顺序表的 “额外空间”(即从下标n开始的位置),避免被后续元素覆盖。 - 第二步:把原数组中从
m开始的剩余元素(共n-m个)向前移动,覆盖前n-m个位置。
- 第一步:把原数组前
- 结果整理:调整顺序表长度为
n,最终前n个位置就是左移后的结果。
二、当前思路的问题分析
空间冗余,不符合 “不允许使用另外数组” 的隐含要求
题目明确提到 “不允许使用另外数组”,核心是尽量减少额外空间(理想为 O (1) 空间)。你的方案用了 m 个额外空间(顺序表长度 m+n),虽然没单独建数组,但仍属于 “额外空间存储”,不符合最优空间设计。
三、优化方向(O (1) 空间,更少移动次数)
题目还要求 “移动数据的次数尽量少”,推荐用 “三次反转法”,无需额外空间,且移动次数仅为 O (n),是最优方案:
- 原理:循环左移
m位,等价于 “反转前m个元素 → 反转剩余n-m个元素 → 反转整个数组”。- 示例(输入n=8, m=3,数组[1,2,3,4,5,6,7,8]):
- 反转前 3 个:
[3,2,1,4,5,6,7,8] - 反转剩余 5 个:
[3,2,1,8,7,6,5,4] - 反转整个数组:
[4,5,6,7,8,1,2,3](最终结果)
- 反转前 3 个:
- 示例(输入n=8, m=3,数组[1,2,3,4,5,6,7,8]):
- 优化后代码示例:
1 |
|
四、总结
你的原始思路 “暂存 + 覆盖” 能实现功能,但存在空间冗余和越界风险;优化后的 “三次反转法” 更贴合题目 “不额外用数组” 和 “移动次数少” 的要求,是更优的解决方案。


