卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35629本站已运行398

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

如何在 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

这个答案复制了问题中的功能。我并不认为结果以字形显示给人类是有意义的。例如,组合字符不会像原始字符串那样组合。

下面是一个人为示例,说明了反向函数的用途:应用程序的某些值集的字符串键往往具有常见的前缀和不常见的后缀。应用程序可以通过反转密钥来改善字符串空间的分布。

卓越飞翔博客
上一篇: 汇合 Kafka Go 客户端中的“无效复制因子”
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏