为什么我在数组中切换元素的代码不够快?

时间:2019-06-17 20:09:02

标签: python python-3.x

我应该写一个代码,将数组的每个元素向左移动一个位置,并执行此操作d次。 例如: 如果array为[1,2,3,4,5],且d的值为2,则应输出以下内容:[3,4,5,1,2](它随着每次迭代而变化,如下所示:[1, 2,3,4,5] ==> [2,3,4,5,1] ==> [3,4,5,1,2]

问题是hackerrank将我的代码乘以10个测试用例中的2个

我读到,使用带有range()函数的for循环比在python中使用while循环要快得多。因此,我消除了所有while循环,并使代码尽可能简洁。但是,当数组中数字的大小和数量太大时,代码就会超时。

这是我的代码(失败时出现大数字):

def rotLeft(a, d):
    for i in range(0,d):
        a=a[1:]+a[:1]
    return a

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    nd = input().split()

    n = int(nd[0])

    d = int(nd[1])

    a = list(map(int, input().rstrip().split()))

    result = rotLeft(a, d)

    fptr.write(' '.join(map(str, result)))
    fptr.write('\n')

    fptr.close()

这段代码是我在hackerrank上找到的解决方案(尽管我认为这是针对python 2的,但这没关系):

def array_left_rotation(a, n, k):
    return a[k:] + a[:k]


n, k = map(int, raw_input().strip().split(' '))
a = map(int, raw_input().strip().split(' '))
answer = array_left_rotation(a, n, k);
print ' '.join(map(str,answer))

解决方案代码通过所有测试输入,但是当数字太大和太多时,我的代码将失败。

2 个答案:

答案 0 :(得分:1)

您在for上使用d循环不必要地导致时间复杂度为 O(nxd),其中n是{ {1}}。您可以直接在a处分割列表,并考虑到d大于或等于d的长度的情况,可以使用{{1}的余数} a的长度上,因此该解决方案在时间复杂度上仅花费 O(n)

d

答案 1 :(得分:0)

考虑一下,如果您需要移动["a","b","c","d"] 100001次...结果如何?

与将其移位1次相同。为什么?因为100000可被4整除(列表的长度)-移位4次后,列表又回到了原来的状态-因此,如果完全重复25k次,您可以进行移位-或简单地计算“无意义移开一次。

比在循环内执行移位要快得多。