我试图解决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
答案 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