2017-09-04 1 views
-1

Ich habe den folgenden Code:entfernt letztes Element in der Scheibe

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) 
} 

Die Aussage in der if Aussage ist die beliebteste Art und Weise in einem Stück ein Element ersetzt pro diesen answer. Das Löschen des letzten Elements aufgrund von i+1 schlägt fehl. Wenn eine Übereinstimmung in dem letzten Element gefunden wird, ist i+1 außerhalb der Grenzen. Gibt es eine bessere Möglichkeit, Elemente zu ersetzen, die die letzten Elemente berücksichtigen?

Antwort

1

Hinzufügen eine Indexprüfung löst Ihr Problem. Copy hat eine bessere Leistung als append aber Ihre ursprüngliche Append-Version wird noch funktionieren. https://gist.github.com/xogeny/b819af6a0cf8ba1caaef

Wenn Sie mit Scheiben arbeiten, ist dies eine gute Seite in Ihrem Go Arsenal hat https://github.com/golang/go/wiki/SliceTricks

Beachten Sie auch, dass die Funktion unten nicht die Scheibe nicht aktualisieren Sie in übergeben, also, während es gedruckt wird, wie viele Elemente, die entfernt wurden, werden die ursprünglichen Elemente nicht entfernt.

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) 
} 

Modified removeElements, die auch die modded Liste

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

Sie auch die Original-Scheibe durch Verweis gibt so ändern kann, dass es nicht

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) 
} 
zurückgegeben werden muss

Beispiel Verwendung https://goplay.space/#leulqgwsjc

+0

Die idiomatische Art zu schreiben 'für {if i == len (nums) {break}' ist 'für i

2

Es sieht so aus, als ob Sie versuchen, alle Elemente zu entfernen, die val entsprechen. Eine Möglichkeit, dies zu tun ist, Wert ungleich val zu Beginn der Scheibe zu kopieren:

func removeElement(nums []int, val int) []int { 
    j := 0 
    for _, v := range nums { 
     if v != val { 
      nums[j] = v 
      j++ 
     } 
    } 
    return nums[:j] 
} 

die neue Scheibe zurück, anstatt die Länge der Rücksendung. Es wird bequemer für den Anrufer sein.

Wenn Sie nur das erste Element gleich val, dann verwenden Sie diesen Code entfernen:

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

ausgezeichnete Antwort, ich würde Ihnen den Stern geben, aber ich normalerweise die Person mit "fast" als gute Antwort, aber mit niedrigeren Punkten. danke nochmal – chefcurry7