任务要求
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
1.输入包含n个整数的数组和位移量m
2.将数组前n-m个元素整体后移m位
3.原数组最后m个元素移动到前m位
4.需处理m>n的情况(取模运算)
任务分析
核心点在于处理元素位置映射关系,数学表达式为:新位置 = (原位置 + m) % n。
任务实现
方法一:切片法
def shift_slice(arr, m):
m %= len(arr)
return arr[-m:] + arr[:-m]
# 示例运行
n = 5
m = 7
original = [1, 2, 3, 4, 5]
result = shift_slice(original, m)
print(f"反转后的数组:{result}") # 输出[4, 5, 1, 2, 3]
运行结果:
反转后的数组:[4, 5, 1, 2, 3]
进程已结束,退出代码为 0
说明:
- 利用Python列表切片特性,arr[-m:]获取后m个元素,arr[:-m]获取前n-m个元素
- 通过m %= len(arr)处理m>n的情况
方法二:三次反转法
def shift_reverse(arr, m):
m %= len(arr)
arr.reverse()
arr[:m] = reversed(arr[:m])
arr[m:] = reversed(arr[m:])
return arr
# 示例运行
arr = [1, 2, 3, 4, 5]
print(f"反转后的数组:{shift_reverse(arr, 2)}") # 输出[4, 5, 1, 2, 3]
运行结果:
反转后的数组:[4, 5, 1, 2, 3]
进程已结束,退出代码为 0
说明:
- 步骤分解:
1.整体反转 → [5,4,3,2,1]
2.前m位反转 → [4,5,3,2,1]
3.后n-m位反转 → [4,5,1,2,3]
- 优势:原地操作不产生新列表
方法三:队列法
def shift_queue(arr, m):
m %= len(arr)
for _ in range(m):
arr.insert(0, arr.pop())
return arr
# 示例运行
arr = [1, 2, 3, 4, 5]
print(f"反转后的数组:{shift_queue(arr, 2)}") # 输出[4, 5, 1, 2, 3]
运行结果:
反转后的数组:[4, 5, 1, 2, 3]
进程已结束,退出代码为 0
说明:
- 每次弹出末尾元素插入头部,循环m次
- 优势:逻辑直观易懂;劣势:大数据量时效率低
完整测试代码:
def shift_slice(arr, m):
m %= len(arr)
return arr[-m:] + arr[:-m]
def shift_reverse(arr, m):
m %= len(arr)
arr.reverse()
arr[:m] = reversed(arr[:m])
arr[m:] = reversed(arr[m:])
return arr
def shift_queue(arr, m):
m %= len(arr)
for _ in range(m):
arr.insert(0, arr.pop())
return arr
if __name__ == "__main__":
n = int(input("输入数组长度n: "))
m = int(input("输入位移量m: "))
arr = list(map(int, input(f"输入{n}个整数(空格分隔): ").split()))
print("\n测试结果:")
print(f"原数组:{arr}")
print(f"切片法:{shift_slice(arr.copy(), m)}")
print(f"反转法:{shift_reverse(arr.copy(), m)}")
print(f"队列法:{shift_queue(arr.copy(), m)}")
运行结果:从键盘上输入字符串“5”、“2”和“1 2 3 4 5”。
输入数组长度n: 5
输入位移量m: 2
输入5个整数(空格分隔): 1 2 3 4 5
测试结果:
原数组:[1, 2, 3, 4, 5]
切片法:[4, 5, 1, 2, 3]
反转法:[4, 5, 1, 2, 3]
队列法:[4, 5, 1, 2, 3]
进程已结束,退出代码为 0
本文暂时没有评论,来添加一个吧(●'◡'●)