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.Builder para 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

  1. []rune(s) converte a string em um slice de runes, permitindo indexar por caractere.
  2. Criamos um strings.Builder chamado b.
  3. O loop começa do último índice (len(runes)-1) e vai até 0, decrementando.
  4. Em cada iteração, b.WriteRune(runes[i]) adiciona a rune ao builder.
  5. No final, b.String() retorna a string construída.
  6. A função main chama reverse e 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 s diretamente 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 de WriteRune: funciona, mas é menos eficiente.
  • Esquecer de converter para []rune e 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