Python 数组左旋转|破解编码面试黑客等级-(因超时而终止)
说明:在大小为n个移位的数组上执行左旋转操作 阵列的每个元素向左各1个单元。例如,如果2 对数组[1,2,3,4,5]执行左旋转,然后对数组执行左旋转 将成为[3,4,5,1,2] 给定一个由n个整数和一个数字d组成的数组,执行d个左旋转 在阵列上。然后将更新后的数组打印为一行 空格分隔整数 输入格式 第一行包含两个空格分隔的整数,表示 n表示整数的个数,d表示整数的个数 必须执行左旋转。第二行包含n 空间分隔整数,用于描述 数组的初始状态。约束条件Python 数组左旋转|破解编码面试黑客等级-(因超时而终止),python,python-3.x,Python,Python 3.x,说明:在大小为n个移位的数组上执行左旋转操作 阵列的每个元素向左各1个单元。例如,如果2 对数组[1,2,3,4,5]执行左旋转,然后对数组执行左旋转 将成为[3,4,5,1,2] 给定一个由n个整数和一个数字d组成的数组,执行d个左旋转 在阵列上。然后将更新后的数组打印为一行 空格分隔整数 输入格式 第一行包含两个空格分隔的整数,表示 n表示整数的个数,d表示整数的个数 必须执行左旋转。第二行包含n 空间分隔整数,用于描述 数组的初始状态。约束条件 1 <= n <= 10^5
1 <= n <= 10^5 1 <= d <= n 1 <= ai <= 10^6
样本输出
5 1 2 3 4
当我们执行d=4左旋转时,阵列将经历以下过程
变更顺序:
[1,2,3,4,5] --> [2,3,4,5,1] --> [3,4,5,1,2] --> [4,5,1,2,3] --> [5,1,2,3,4]
因此,我们将数组的最终状态打印为一行
以空格分隔的值,即5 1 2 3 4
代码:
当我在十个测试用例中运行这段代码时,有两个失败了,比如由于超时而终止,这是一个问题,所以给你精确的解决方案比没有用更糟糕。相反,试着改变你的想法。再看一遍需求。您不一定需要存储整个数字数组;你可以简单地一步一步地浏览列表,只在最后存储你需要写的内容,阅读完后立即写下其余的内容。这将更快,并且使用更少的内存。您对解决方案的强制太多,导致执行非常缓慢。我不会告诉你确切的解决方案,但我脑海中有几个提示: 减少左操作的数量提示:考虑mod操作 数组的元素不会任意改变位置。他们只移动了d次。试着想出一种不使用嵌套循环而利用这些信息的方法。
通过使用pop和append内置函数解决了问题黑客链接所有通过的测试用例:尝试使用此代码@glibdud非常简单易懂,避免了时间限制错误
# Complete the rotLeft function below.
def rotLeft(a, d):
new = []
for i in range(len(a),0,-1):
new.append(a[d-i])
return new
使用切片可以轻松解决此问题:
def array_left_rotation(arr, d):
return arr[d:]+arr[:d]
函数将返回从第dth元素开始到第d-1元素结束的切片列表,该列表将与从开始到第d-1元素的元素列表连接起来。您能否回答您的问题以解释此代码示例如何回答该问题?
def rotLeft(a, d):
for i in range(d):
removed = a.pop(0)
a.append(removed)
return a
# Complete the rotLeft function below.
def rotLeft(a, d):
new = []
for i in range(len(a),0,-1):
new.append(a[d-i])
return new
def rotate_left(arr, rot):
if len(arr) == 0:
return ' '
res = []
arr.reverse()
while rot > 0:
res.append(arr.pop())
rot -= 1
arr.reverse()
arr = arr+res
return ' '.join(map(str, arr))
#!/bin/python3
import math
import os
import random
import re
import sys
def leftrotation(arraysize, rotation, array):
rotation = rotation % arraysize
temp2 = []
temp1 = array[0:rotation]
temp2 = array[rotation:]
word = ' '.join(map(str, temp2+temp1))
print(word)
if __name__ == '__main__':
nd = input().split()
n = int(nd[0])
d = int(nd[1])
a = list(map(int, input().rstrip().split()))
leftrotation(n, d, a)
def array_left_rotation(arr, d):
return arr[d:]+arr[:d]