2017-12-29 62 views
-1

크기의 배열에서 왼쪽 회전 연산은 배열 요소의 각 요소를 왼쪽으로 1 단위 이동합니다. 예를 들어 배열 [1,2,3,4,5]에서 왼쪽 왼쪽 회전이 2 번 수행되면 배열은 [3,4,5,1,2]가됩니다.데이터 구조의 구현에서 내 실수를 지적하십시오

정수와 숫자의 배열이 주어진다면, 배열에서 왼쪽 회전을 수행하십시오. 그런 다음 업데이트 된 배열을 공백으로 구분 된 한 줄의 정수로 인쇄하십시오.

시료 입력 : 5,4
샘플 출력 : 5 1 2 3 4 내 출력된다 : 1 2 3 4 1

#!/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)로 돌아 실행을 중지 할 코드는 반환되기 전에 한 번만 반복됩니다.

2)이 라인은 논리에 오류가 포함

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

우리가 첫 번째 위치에서 마지막 값을 삽입 좌측 회전을 수행하려면. 문제는 외부에 루프가 아닌 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. 먼저 (0, D), 그것으로 끝나는 전체에 대한 실행되고 있지 않습니다 당신의 1 차 및 2 차 요소는 같은 값

    이 때문에 첫 번째 반복하고 왼쪽 회전이 완료되지 않은 당신이 화장실을 실행하는 IndexError 때문에
    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. 코드가 전체 반복에 대해 실행하더라도 당신은 얻을 것이다 P (0, 길이) 때 I = 길이 1 => 난 + 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

코드의 문제점은, 난 그냥이 질문에 대해 언급 list 방법을 사용하여 더 좋은 솔루션을 추가 할 무엇 Rassar 이미 적용 : 다른 사람이 코드에서 문제를 지적하기 때문에

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 = 1'이 아니라면'O (k)'와'O (1)'가 다르게 느껴진다. – RoadRunner

+2

관제사 콘래드, 당신은 기술적으로 정확합니다. 올바른 최선의 종류입니다. 그러나이 알고리즘은'n (n)'이''len (l)'인데'n (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), 그.