专业的JAVA编程教程与资源

网站首页 > java教程 正文

Python实现数组元素循环右移的多种方法

temp10 2025-03-28 21:21:07 java教程 7 ℃ 0 评论


Python实现数组元素循环右移的多种方法

任务要求

有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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表