首頁  >  文章  >  後端開發  >  如何在 Golang 中編寫函數來僅使用 1 個分配/操作來反轉 unicode 字串?

如何在 Golang 中編寫函數來僅使用 1 個分配/操作來反轉 unicode 字串?

王林
王林轉載
2024-02-14 10:30:09956瀏覽

如何在 Golang 中编写函数来仅使用 1 个分配/操作来反转 unicode 字符串?

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除