3 回答

TA貢獻1836條經驗 獲得超5個贊
這是一個替代解決方案,雖然可能有點冗長:
func sameStringSlice(x, y []string) bool {
if len(x) != len(y) {
return false
}
// create a map of string -> int
diff := make(map[string]int, len(x))
for _, _x := range x {
// 0 value for int is 0, so just increment a counter for the string
diff[_x]++
}
for _, _y := range y {
// If the string _y is not in diff bail out early
if _, ok := diff[_y]; !ok {
return false
}
diff[_y] -= 1
if diff[_y] == 0 {
delete(diff, _y)
}
}
return len(diff) == 0
}
試試吧 Go Playground

TA貢獻1829條經驗 獲得超7個贊
其他答案有更好的時間復雜度O(N)VS (O(N log(N)),這是我的答案,也是我的解決方案將占用更多的內存,如果在片元素被頻繁地重復,但我想補充它,因為我覺得這是應該做的最直接的方式它:
package main
import (
"fmt"
"sort"
"reflect"
)
func array_sorted_equal(a, b []string) bool {
if len(a) != len(b) {return false }
a_copy := make([]string, len(a))
b_copy := make([]string, len(b))
copy(a_copy, a)
copy(b_copy, b)
sort.Strings(a_copy)
sort.Strings(b_copy)
return reflect.DeepEqual(a_copy, b_copy)
}
func main() {
a := []string {"a", "a", "c"}
b := []string {"c", "a", "c"}
c := []string {"z","z","x"}
d := []string {"x","z","z"}
fmt.Println( array_sorted_equal(a, b))
fmt.Println( array_sorted_equal(c, d))
}
結果:
false
true

TA貢獻1799條經驗 獲得超6個贊
我認為最簡單的方法是將每個數組/切片中的元素映射到它們的出現次數,然后比較映射:
func main() {
x := []string{"a","b","c"}
y := []string{"c","b","a"}
xMap := make(map[string]int)
yMap := make(map[string]int)
for _, xElem := range x {
xMap[xElem]++
}
for _, yElem := range y {
yMap[yElem]++
}
for xMapKey, xMapVal := range xMap {
if yMap[xMapKey] != xMapVal {
return false
}
}
return true
}
如果您的數組/切片包含不同類型或不同長度的元素,您將需要添加一些額外的盡職調查,例如短路。
- 3 回答
- 0 關注
- 211 瀏覽
添加回答
舉報