2016-08-09 5 views
-1

꽤 간단한 leetcode에 문제가 있습니다. 그러나 두 번째 해결책은 정확하지 않습니다. (OG 질문 : ) 배열 num이 주어지면, 모든 0을 끝으로 이동시키는 함수를 작성하면서 비제로 요소. 예목록에있는 ele [에 대한 python과 목록의 차이에 대한 ele?

주어진 nums의 = [0, 1, 0, 3, 12, 함수를 호출 한 후, nums [1, 3, 12, 0, 0].

되어야

참고 : 어레이의 복사본을 만들지 않고 현재 위치에서 수행해야합니다. 총 작업 수를 최소화하십시오.

class Solution(object): 
def moveZeroes(self, nums): 
    """ 
    :type nums: List[int] 
    :rtype: void Do not return anything, modify nums in-place instead. 
    """ 
    k = 0 
    for ele in nums[:]: 
     if ele == 0: 
      nums.remove(0) 
      k += 1 
    nums.extend([0]*k) 


class Solution(object): -------Incorrect solution 
def moveZeroes(self, nums): 
    """ 
    :type nums: List[int] 
    :rtype: void Do not return anything, modify nums in-place instead. 
    """ 
    k = 0 
    for ele in nums: 
     if ele == 0: 
      nums.remove(0) 
      k += 1 
    nums.extend([0]*k) 

왜 다른 점이 있습니까?

+5

첫 번째 해결 방법은 입력 복사본을 만들기 때문에 올바르지 않습니다. – user2357112

+2

http://stackoverflow.com/questions/6022764/python-removing-list-element-while-iterating-over-list <- 여기를 참조하십시오. 올바른 솔루션에서는 목록의 _copy_를 반복하고, 잘못된 솔루션에서는 목록 자체를 반복합니다. – Will

+2

내 대답을 확인하면 현재 반복되는 시퀀스에서 물건을 제거하는 것이 나쁜 이유를 확인할 수 있습니다. http://stackoverflow.com/a/31704332/1318181 – IanAuld

답변

0
가 이상 반복되는 동안 당신은 모두 목록을 수정 목록을 복사하지 없습니다

:

class Solution(object): 
    def moveZeroes(self, numbers): 
     """ 
     :type numbers: List[int] 
     :rtype: void Do not return anything, modify numbers in-place instead. 
     """ 
     k = 0 

     while True: 
      try: 
       numbers.remove(0) 
       k += 1 
      except ValueError: 
       break 

     numbers.extend([0] * k) 

numbers = [0, 1, 0, 3, 12] 

print(id(numbers), "->", numbers) 

Solution().moveZeroes(numbers) 

print(id(numbers), "->", numbers) 

출력 : 이상 반복하는 동안이 목록을 수정할 수 없습니다

(4348993904, '->', [0, 1, 0, 3, 12]) 
(4348993904, '->', [1, 3, 12, 0, 0]) 
0

그것. 파이썬에서는 불법입니다.

[:]은 반복 목록을 작성합니다.

그러나 질문을하면 목록의 복사본을 만들 필요가 없으므로 두 가지 해결책이 모두 올바르지 않습니다.

나는 당신이 배우기를 원하기 때문에 그것을 고치는 방법을 정확히 알려주지 않을 것이지만, 당신은 세트를 만들어야한다. .remove()을 사용할 때마다 세트에 추가하십시오. for 루프를 시작하기 전에 요소가 세트에 있는지 확인하십시오. 루프가 끝나면 실제로 목록의 요소를 목록에서 제거하십시오.

집합을 만들려면 set()을 사용하십시오. 세트에 요소를 추가하려면 set_name.add()


파이썬을 배울 수 leetcode를 사용하지 마십시오 사용합니다. Leetcode는 기술 코딩 인터뷰 용이며 파이썬은별로 좋지 않습니다. 인터뷰를 통과하지 못할 것입니다.

코드가 PEP 8을 위반하며 클래스가 object을 상속하지 않습니다. 들여 쓰기가 잘못되어 파이썬에서 오류가 발생합니다. PyCharm과 같은 편집기 (무료입니다)를 사용하면 향후 이러한 오류를 경고 할 수 있습니다. 그것은 중대한 IDE, 심각하게, 그것을 밖으로 시도하십시오.

관련 문제