阵列向左旋转|破解编码面试的黑客排名-(由于超时而终止)

时间:2019-02-13 13:25:37

标签: python python-3.x

  

EXPLANATION:对大小为n的数组进行左旋转操作   数组的每个元素都在左侧1个单位处。例如,如果2   左旋转在数组[1,2,3,4,5]上执行,然后在数组上执行   将成为[3,4,5,1,2]。

     

给出n个整数和一个数字的数组d,执行d个向左旋转   在阵列上。然后将更新后的数组打印为一行   用空格分隔的整数。

     

输入格式

     

第一行包含两个以空格分隔的整数,表示   n(整数个数)和d(整数个数   您必须执行左旋转)。第二行包含n   用空格分隔的整数,描述了   数组的初始状态。约束

1 <= n <= 10^5  1 <= d <= n  1 <= ai <= 10^6 
     

输出格式打印n行以空格分隔的整数   表示执行d左移后数组的最终状态   旋转。

     

样本输入

5 4 1 2 3 4 5
     

样本输出

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。

代码:

import math
import os
import random
import re
import sys

def rotLeft(a, d):
    for i in range(d):
        temp=a[0]
        for i in range(len(a)-1):
            a[i]=a[i+1]
        a[n-1]=temp
    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()

当我在十个测试用例中运行此代码时,有两个失败,例如(由于超时而终止)

7 个答案:

答案 0 :(得分:1)

使用切片可以轻松解决此问题:

def array_left_rotation(arr, d):
    return arr[d:]+arr[:d]

该函数将返回从dth元素开始到最后的切片列表,并且此列表将与从第d-1个元素开始的元素列表连接在一起。

答案 1 :(得分:0)

这是一个问题,因此为您提供准确的解决方案要比没用的糟糕。相反,尝试改变您的想法。再次查看需求。您不一定需要存储整个数字数组;您可以简单地浏览列表,仅存储最后需要写的内容,其余内容在阅读后立即写出。这样会更快,并且使用更少的内存。

答案 2 :(得分:0)

您过分地强迫解决方案,这使执行速度非常慢。我不会告诉您确切的解决方案,但会提示一些提示:

  1. 减少剩余操作数(提示:考虑mod操作)
  2. 数组的元素不会任意改变位置。他们只移位了 d 次。尝试考虑一种无需使用嵌套循环即可利用此信息的方法。

答案 3 :(得分:0)

def rotLeft(a, d):

    for i in range(d):
        removed = a.pop(0)
        a.append(removed)
    return a

使用弹出和附加内置函数解决的问题

答案 4 :(得分:0)

HackerRank通过了所有测试案例:尝试使用此代码@glibdud非常简单易懂,避免了TLE(时间限制错误)

# 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

答案 5 :(得分:0)

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))

答案 6 :(得分:0)

#!/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)