7-4 数组循环左移

7-4 数组循环左移

本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯a**n−1)变换为(a**ma**n−1a0a1⋯a**m−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式:

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

输入样例:

1
2
8 3
1 2 3 4 5 6 7 8

输出样例:

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)))