php小編子墨將帶您了解如何在Golang中編寫函數來僅使用1個分配/操作來反轉unicode字串。反轉字串是一項常見的操作,但在Golang中,我們可以透過一個巧妙的方法來實現只使用1個分配/操作的效果。這種方法基於字串是不可變的特性,我們可以將字串轉換為rune切片,然後透過交換切片中的元素來實現字串的反轉。接下來,讓我們一起來看看具體的實作方法吧!
我需要為 unicode 字串寫自己的 reverse.Reverse
模擬。這是我的程式碼:
func Reverse(input string) string { runes := []rune(input) var result strings.Builder result.Grow(len(runes)) for i := len(runes) - 1; i >= 0; i-- { result.WriteRune(runes[i]) } return result.String() }
但它會產生 2 個分配/操作:
cpu: 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz BenchmarkReverse BenchmarkReverse-16 297900 7014 ns/op 1792 B/op 2 allocs/op
如何只進行 1 次分配/操作?我知道,這是可能的
而且我也不明白為什麼result.Grow(len(runes))
使5 個分配/操作和result.Grow(len(input))
- 1 個分配/操作
建立具有所需容量的strings.Builder。以相反的順序將來源字串中的符文寫入建構器。
func Reverse(str string) string { var result strings.Builder result.Grow(len(str)) for len(str) > 0 { r, size := utf8.DecodeLastRuneInString(str) result.WriteRune(r) str = str[:len(str)-size] } return result.String() }
https://www.php.cn/link/6acfe16b984d473723a8495a84e548b7
這個答案複製了問題中的功能。我並不認為結果以字形顯示給人類是有意義的。例如,組合字元不會像原始字串那樣組合。
下面是一個人為範例,說明了反向函數的用途:應用程式的某些值集的字串鍵往往具有常見的前綴和不常見的後綴。應用程式可以透過反轉密鑰來改善字串空間的分佈。
以上是如何在 Golang 中編寫函數來僅使用 1 個分配/操作來反轉 unicode 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!