hackerrank 循环数组旋转 Python

2024-04-28 06:58:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在HackerRank上解决循环数组的旋转问题。 https://www.hackerrank.com/challenges/circular-array-rotation/problem

下面的代码通过了除case#4之外的所有测试用例,它会得到一个运行时错误。有人能指出问题吗?在

def circularArrayRotation(a, k, queries):

    if k < len(a):
        k = k
    elif k == len(a):
        k = 0
    else:
        k = k%a

    newList = []


    for val in queries:
        newInd = -k+val
        if abs(newInd) > len(a):
            newInd = newInd - (len(a)-1)
            newList += [a[newInd]]
        else:
            newList += [a[newInd]]        


    return newList

Tags: httpscomlenifwwwval数组else
3条回答

你可以用deque,deque是一个双端队列。它可以用来在两端添加或删除元素。在

from collections import deque
    def circularArrayRotation(a, k, queries):
        result=[]
        a = deque(a) 
        a.rotate(k) 
        a = list(a) 

        for v in queries:
            result.append(a[v])

        return(result)

你的解决方案是正确的。但没有在规定的时限内运行,仅限于第4例。在

每次都要计算新查询的值,这需要时间。在

你能做的就是立刻得到旋转的数组。然后对旋转数组运行查询。将结果保存在列表中并返回。在

def circularArrayRotation(a, k, queries):

    new_arr = a[-k%len(a):] + a[:-k%len(a)]
    # list slicing is done here.  it will get the right rotated array 

    result = []
    for i in queries:
        result.append(new_arr[i])
        # running queries on rotated array
    return result

使用上述方法,可以在o(n)时间内完成列表切片。然后运行查询是o(1)次。在

def circularArrayRotation(a, k, queries):
    j= len(a)

    for x in range(k):
        n=a[j-1]
        a.insert(0,n)
        a.pop(j)

    newList= []

    for m in queries:
        newList.append(a[m])

    return newList

相关问题 更多 >