dcd
dcd

Reputation: 11

How to make this run 'faster'? Or is that the right terminology?

I am new to python and I submitted this code for a Hackerrank problem Arrays and Simple Queries, but for a large number of test cases the program is 'terminated due to timeout'. How can I make this more efficient?

I've pasted the main swap function below. (Repeats M times)

temp = input()
temp = temp.split(" ")
i = int(temp[1])-1
j = int(temp[2])-1
rep = (i-1)+1

if(temp[0]=='1') :
        rep = (i-1)+1
        while(i<=j) :
            count = i-1
            ex1 = count
            ex2 = i
            for k in range(0,rep) :
                arr[ex1], arr[ex2] = arr[ex2], arr[ex1]
                ex1 = ex1-1
                ex2 = ex2-1
            i = i+1
else :
    rep = (N-(j+1))
    while(j>=i) :
        count = j+1
        ex1 = count
        ex2 = j
        for k in range(0,rep) :
            arr[ex1], arr[ex2] = arr[ex2], arr[ex1]
            ex1 = ex1+1
            ex2 = ex2+1
        j=j-1

Upvotes: 1

Views: 53

Answers (1)

iz_
iz_

Reputation: 16633

Instead of using many loops, you can try simply concatenating slices:

def query(lst, t, start, end):
    # Convert to proper zero-indexed index
    start -= 1

    if t == '1':
        return lst[start:end] + lst[:start] + lst[end:]
    elif t == '2':
        return lst[:start] + lst[end:] + lst[start:end]


# Get the input however you want
N, M = map(int, input().split())
arr = list(map(int, input().split()))
assert len(arr) == N

for _ in range(M):
    t, start, end = input().split()
    arr = query(arr, t, int(start), int(end))

print(abs(arr[0] - arr[N - 1]))
print(*arr)

Input:

8 4
1 2 3 4 5 6 7 8
1 2 4
2 3 5
1 4 7
2 1 4

Output:

1
2 3 6 5 7 8 4 1

Upvotes: 1

Related Questions