2017-09-04 2 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) 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) 
} 
を返却する必要がないように、あなたはまた、参照することにより、元のスライスを修正することができモッドリスト

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

を返し

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

使用例https://goplay.space/#leulqgwsjc

+0

for {if i == len(nums){break} 'を書く慣用句は' for i

2

valに等しいすべての要素を削除しようとしているようです。これを行う1つの方法は、スライスの先頭に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

関連する問題