Médio Go
Invertendo uma string com runes
Enunciado
Escreva uma função reverse(s string) string que inverta a ordem das runes de uma string, preservando caracteres multibyte. Use strings.Builder para montar o resultado.
Requisitos
- A função deve receber uma string e retornar uma string invertida.
- Deve tratar corretamente caracteres Unicode (ex.:
"Olá"vira"álO"). - Use
strings.Builderpara construir a string de saída.
Código inicial
package main
import (
"fmt"
"strings"
)
func reverse(s string) string {
// Seu código aqui
return ""
}
func main() {
fmt.Println(reverse("Olá, mundo!"))
}
Saída esperada
!odnum ,álO
Ver dica
Converta a string para um slice de runes ([]rune(s)), itere de trás para frente e escreva cada rune no strings.Builder com WriteRune.
Mostrar solução
package main
import (
"fmt"
"strings"
)
func reverse(s string) string {
runes := []rune(s) // converte para runes
var b strings.Builder
for i := len(runes) - 1; i >= 0; i-- {
b.WriteRune(runes[i])
}
return b.String()
}
func main() {
fmt.Println(reverse("Olá, mundo!"))
}
Passo a passo
[]rune(s)converte a string em um slice de runes, permitindo indexar por caractere.- Criamos um
strings.Builderchamadob. - O loop começa do último índice (
len(runes)-1) e vai até 0, decrementando. - Em cada iteração,
b.WriteRune(runes[i])adiciona a rune ao builder. - No final,
b.String()retorna a string construída. - A função
mainchamareversee imprime o resultado.
Por que funciona
Converter para []rune garante que cada elemento seja um code point, não um byte. Assim, caracteres como á são tratados como uma unidade. O strings.Builder acumula as runes de forma eficiente, sem criar várias strings intermediárias.
Erros comuns
- Iterar sobre
sdiretamente com índice de byte:for i := len(s)-1; i >= 0; i--inverteria bytes, corrompendo caracteres multibyte. - Usar
b.WriteString(string(runes[i]))em vez deWriteRune: funciona, mas é menos eficiente. - Esquecer de converter para
[]runee tentar inverter a string original, que é imutável.
Outra forma de resolver
Usar um slice de runes e trocar elementos no lugar:
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
Essa versão é mais direta e evita o Builder, mas o enunciado pede o uso de strings.Builder.
Saída esperada
!odnum ,álO