7-4 数组循环左移

7-4 数组循环左移
Flaw7-4 数组循环左移
本题要求实现一个对数组进行循环左移的简单函数:一个数组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
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 def reverse(arr, start, end):
"""反转数组从start到end的元素"""
while start < end:
arr[start], arr[end] = arr[end], arr[start]
start += 1
end -= 1
def left_rotate(arr, n, m):
"""循环左移m个位置"""
m = m % n # 处理m大于n的情况
#8 7 6 5 4 3 2 1
reverse(arr, 0, n - 1) # 反转整个数组
#4 5 6 7 8 3 2 1
reverse(arr, 0, n - m - 1) # 反转前m个元素
#4 5 6 7 8 1 2 3
reverse(arr, n - m, n - 1) # 反转后n-m个元素
# 读取输入
n, m = map(int, input().split())
arr = list(map(int, input().split()))
# 左移操作
left_rotate(arr, n, m)
# 输出结果
print(" ".join(map(str, arr)))








