Maison  >  Article  >  développement back-end  >  Comment écrire une fonction en Golang pour inverser une chaîne Unicode en utilisant une seule affectation/opération ?

Comment écrire une fonction en Golang pour inverser une chaîne Unicode en utilisant une seule affectation/opération ?

王林
王林avant
2024-02-14 10:30:09955parcourir

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

L'éditeur PHP Zimo vous expliquera comment écrire une fonction dans Golang pour inverser une chaîne Unicode en utilisant une seule affectation/opération. Inverser une chaîne est une opération courante, mais dans Golang, nous pouvons obtenir l'effet en utilisant une seule affectation/opération de manière intelligente. Cette méthode est basée sur le fait que les chaînes sont immuables. Nous pouvons convertir la chaîne en tranche de rune puis inverser la chaîne en échangeant les éléments de la tranche. Examinons ensuite la méthode de mise en œuvre spécifique !

Contenu de la question

Je dois écrire ma propre reverse.Reverse simulation pour les chaînes Unicode. Voici mon code :

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

Mais cela se traduit par 2 missions/opérations :

cpu: 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz
BenchmarkReverse
BenchmarkReverse-16       297900              7014 ns/op            1792 B/op          2 allocs/op

Comment faire 1 seule allocation/opération ? Je sais, c'est possible

Et je ne comprends pas non plus pourquoi result.Grow(len(runes)) 使 5 个分配/操作和 result.Grow(len(input)) - 1 mission/opération

Solution de contournement

Créer des chaînes.Builder avec la capacité requise. Écrit les runes de la chaîne source vers le constructeur dans l'ordre inverse.

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

Cette réponse reproduit la fonctionnalité de la question. Je ne pense pas qu'il soit logique que les résultats soient affichés aux humains sous forme de glyphes. Par exemple, les caractères combinés ne se combinent pas comme les chaînes brutes.

Voici un exemple artificiel qui illustre l'utilisation de la fonction inverse : certains ensembles de valeurs d'une application ont tendance à avoir des clés de chaîne avec des préfixes communs et des suffixes peu communs. Les applications peuvent améliorer la répartition de l'espace des chaînes en inversant les clés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer