2017-09-04 14 views
-1

에서 마지막 요소를 제거 나는 다음과 같은 코드가 있습니다슬라이스

func TestRemoveElement(t *testing.T) { 
    nums := []int{3, 2, 2, 3} 
    result := removeElement(nums, 3) 

    if result != 2 { 
     t.Errorf("Expected 2, but it was %d instead.", result) 
    } 
} 

func removeElement(nums []int, val int) int { 

    for i, v := range nums { 
     if v == val { 
      nums = append(nums[:i], nums[i+1:]...) 
     } 
    } 
    return len(nums) 
} 

if 문 내부의 문이 answer 당 조각의 요소를 대체하는 가장 인기있는 방법입니다. 그러나 이것은 i+1으로 인해 마지막 요소를 삭제하지 못합니다. 즉, 일치 항목이 마지막 요소에서 발견되면 i+1이 범위를 벗어납니다. 마지막 요소를 고려하는 요소를 대체하는 더 좋은 방법은 무엇입니까?

답변

1

인덱스 검사를 추가하여 문제를 해결합니다. Copyappend보다 성능이 좋지만 원본 추가 버전은 계속 작동합니다. 당신이 조각하여 작업하는 경우 https://gist.github.com/xogeny/b819af6a0cf8ba1caaef

이가 얼마나 많은 인쇄됩니다 동안 있도록 https://github.com/golang/go/wiki/SliceTricks

는 또한, 함수가 아래가 전달 된 슬라이스를 업데이트하지 않습니다 당신의 이동 무기고에있는 좋은 페이지입니다 원래 슬라이스에는 제거 된 항목이 제거되지 않습니다. 그것을하지 않도록도 또한 참조하여 원래 조각을 수정할 수 있습니다

func removeElement(nums []int, val int) (numberOfItemsRemoved int, newArr []int) { 
    var i int 
    for { 
     if i == len(nums) { 
      break 
     } 

     if nums[i] == val { 
      nums = nums[:i+copy(nums[i:], nums[i+1:])] 
      i = 0 
     } 
     i++ 
    } 
    return len(nums), nums 
} 

https://goplay.space/#1yfhTkZC4o

modded하게 목록을 반환

func removeElement(nums []int, val int) int { 
    var i int 
    for { 
     if i == len(nums) { 
      break 
     } 

     if nums[i] == val { 
      nums = nums[:i+copy(nums[i:], nums[i+1:])] 
      i = 0 
     } 
     i++ 
    } 
    return len(nums) 
} 

수정 removeElements는

func removeElement(nums *[]int, val int) int { 
    var i int 
    for { 
     if i == len(*nums) { 
      break 
     } 
     slice := (*nums) 
     if slice[i] == val { 
      slice = slice[:i+copy(slice[i:], slice[i+1:])] 
      *nums = slice 
      i = 0 
     } 
     i++ 
    } 
    return len(*nums) 
} 

를 반환 할

예제 사용법 https://goplay.space/#leulqgwsjc

+0

for {if i == len (nums) {break}'을 쓰는 관용구는'for i

2

val과 같은 모든 요소를 ​​제거하려는 것 같습니다. 이 작업을 수행하는 한 가지 방법은 슬라이스의 시작 부분에 val 같지 않은 값을 복사하는 것입니다

func removeElement(nums []int, val int) []int { 
    j := 0 
    for _, v := range nums { 
     if v != val { 
      nums[j] = v 
      j++ 
     } 
    } 
    return nums[:j] 
} 
는 길이를 반환하는 대신 새 슬라이스를 돌려

. 발신자가 더 편리 할 것입니다.

만, val 동일 첫 번째 요소를 제거 한 후이 코드를 사용하려면

:

func removeElement(nums []int, val int) []int { 
    for i, v := range nums { 
     if v == val { 
      return append(nums[:i], nums[i+1:]...) 
     } 
    } 
    return nums 
} 
+0

훌륭한 대답, 나는 당신에게 별을 줄 것이다. 그러나 나는 일반적으로 그 사람에게 "거의"좋은 대답을하지만 더 낮은 점수를 주었다. 다시 한 번 감사드립니다 – chefcurry7