hackerrank圆形阵列旋转Python

时间:2019-01-21 00:21:09

标签: python

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

以下代码通过所有测试用例,但第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

8 个答案:

答案 0 :(得分:1)

您的解决方案是正确的。但不是在这种情况下仅在这种情况下运行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)。

答案 1 :(得分: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

答案 2 :(得分:0)

可以使用双端队列(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)

答案 3 :(得分:0)

我知道这已经很老了,但是我只是在解决这个问题,所以我想也许也应该顺便去做,否则你的情况是错误的!应该是k = k % len(a),您写了k % a,现在我写的是c ++,所以不知道它在python中做什么,但是我很确定不会自动将其放入{{1 }}另外,为什么还要每次都以模为单位将它放在len(a)块中,如果它较小,则没有值变化,因为if else会将其固定为正确的值。

答案 4 :(得分:0)

我相信,如AnkushRasgon和shyamantha的回答一样,双双是行之有效的方法。在这里,我用Java发布我的版本。所有测试都通过了。

static int[] circularArrayRotation(int[] a, int k, int[] queries) {

    LinkedList<Integer> list = Arrays.stream(a).boxed()
            .collect(Collectors.toCollection(LinkedList::new));
    
    for (int i = 0; i < k; i++) {
        list.push(list.pollLast());
    }
    
    for (int i = 0; i < queries.length; i++) {
        if (queries[i] < list.size()) {
            queries[i] = list.get(queries[i]);
        }
    }
    
    return queries;
}

答案 5 :(得分:0)

def circularArrayRotation(a, k, queries):
    reverse_a = list(reversed(a))
    reverse_a_copy = reverse_a.copy()
    for x in range(k):
        item = reverse_a[x]
        reverse_a_copy.remove(item)
        reverse_a_copy.append(item)
    line = []
    for x in queries:
        line.append(list(reversed(reverse_a_copy))[x])
    return line

答案 6 :(得分:0)

a=[1,2,3,4,5]
s=2
def rotateList(arr,d,n):
  arr[:]=arr[d-1:n]+arr[0:d-1]
  return arr

print(rotateList(a,5,len(a)))

答案 7 :(得分:0)

def circularArrayRotation(a, k, queries):
    #rotation
    for _ in range(k):
        a.insert(0, a.pop())
    #putting answer according to query
    ans = []
    for i in queries:
        ans.append(a[i])    
    return ans