2017-12-29 64 views
-1

サイズの配列の左回転操作は、配列の要素のそれぞれを1単位左にシフトします。たとえば、配列[1,2,3,4,5]に対して2回の左回転が実行された場合、配列は[3,4,5,1,2]になります。このデータ構造の実装で私の間違いを指摘してください

整数と数値の配列が与えられている場合、配列上で左回転を実行します。更新された配列をスペースで区切られた整数の1行として出力します。

サンプル入力: 5、4
サンプル出力:5 1 2 3 4 私の出力は次のようになります。2 1 2 3 4

#!/bin/python3 

    import sys 

    def leftRotation(a, d): 
     #Main Logic here 
     length=len(a) 
     for j in range(0,d): 
      for i in range(0,length): 
       temp=a[0] 
       a[i]=a[i+1] 
       a[length-1]=temp 
       return a 
      return a 
     return a 



    if __name__ == "__main__": 
     n, d = input().strip().split(' ') 
     n, d = [int(n), int(d)] 
     a = list(map(int, input().strip().split(' '))) 
     result = leftRotation(a, d) 
     print (" ".join(map(str, result))) 
+0

エラー/出力はどのようになっていますか? –

+0

私の出力は2 2 3 4 1 –

+0

です。 'temp = a [0]'はループ内でハードコードされています。その論理を考えてみてください。 –

答えて

2

1)リターンが実行を停止しますそのコードは一度ループしてから返されます。我々は最初の位置に最後の値を挿入し、左回転を行うには

temp=a[0] 
a[i]=a[i+1] 
a[length-1]=temp 

2)これらの行は、ロジックのエラーが含まれています。あなたの問題は、外側にではなくループ内にtemp = a[0]を割り当てていることです。また、ループ内の最後の値を再割り当てします。

固定エラーのすべて:

def leftRotation(a, d): 
    #Main Logic here 
    length=len(a) 
    for j in range(0,d): 
     temp=a[0] 
     for i in range(0,length - 1): 
      a[i]=a[i+1] 
     a[length-1]=temp 
    return a 

はあなたに正しい答えを与えます。

(PS左回転をするための標準的なlist方法を使用してはるかに簡単な方法があります:。a.append(a.pop(0)))は

0
  1. すべてのプログラムの最初には、(D、0)を全体のためで、その結末を実行していません最初の反復と左回転が完了していない、あなたの第一及び第二の要素は、あなたのコードは全体の反復のために実行されている場合でも、同じ値

    def leftRotation(a, d): 
        #Main Logic here 
        length=len(a) 
    
        for j in range(0,d): 
         temp=a[0] 
         for i in range(0,length): 
         a[i]=a[i+1] # a[i](i == 0) & a[i+1](i == 1) will have same values 
         a[length-1]=temp 
         return a #Because your program is ending here 
    
  2. を持っているので、あなたがトイレを実行しているIndexError ので、取得しますP(0、長さ)、あなたのI =長さ-1 => I + 1 =長さ、我々は唯一のインデックス "ゼロ" リストで& "長さ-1" にリストで

固定した後どちらの問題でも、これはうまくいく可能性があります: -

def leftRotation(a, d): 
    #Main Logic here 
    length=len(a) 
    for j in range(0,d): 
     temp=a[0] 
     for i in range(0,length-1): 
      a[i]=a[i+1] 

     a[length-1]=temp 

    return a 

リストスライシングを使用した方がはるかに良い答えです。

function rotate_list(a,d): 
    return a[d:] + a[d:] 
+0

あなたのインデントが最後のreturnステートメントで間違っています。 – rassar

+0

@rassarが修正されました。ありがとうございます。 –

+0

これは正しいかもしれませんが、非常に効率的です。 O(1)という解決策があります。 –

1

Rassarが既にコードに問題が何であるかカバーし、私はちょうど答えで述べたlist方法を使用してよりよい解決策を追加したい:他の人があなたのコードで問題を指摘しておりますので

def left_rotation(l, offset): 
    offset %= len(l) 
    return l[offset:] + l[:offset] 

result = left_rotation([1, 2, 3, 4, 5], 12) 
print(" ".join(str(item) for item in result)) # 3 4 5 1 2 
+0

おめでとう、これはO(1)ソリューションですが、私はOPがhttps://app.codility.com/programmers/ –

+0

からテストを騙っていると思われます。@PauloScardine 'O(k ) 'リストには?ここで、「k」はスライスの長さです。私は、 'k(k)'と 'O(1)'は 'k = 1'を除いてここでは違うと感じます。 – RoadRunner

+2

官僚コンラッド、あなたは技術的に正しいです、正解の最もよい種類。しかし、このアルゴリズムは 'n(n)'が '' len(l) 'であるが、' 'n ''がオフセットされている' 'O(n)' 'に興味がある。すべての実用的な目的のために、この場合には「1」に近似することができる。 –

1

を、あなたもcollections.dequeを使用して、このソリューションを試みることができる:

from collections import deque 

def left_rotation(lst, n): 
    queue = deque(lst) 

    removed = [queue.popleft() for i in range(n)] 

    return list(queue) + removed 

print(" ".join(map(str, left_rotation([1,2,3,4,5], 2)))) 

どの出力:

3 4 5 1 2 

注:popleft()がより効率的である、ここO(1)である代わりにO(n)あるpop(0)、その。

関連する問題