Разворот строки - разбор алгоритимической задачи

Задача:

У есть строка, например "Привет!" требуется развернуть символы в ней в обратном порядке, чтобы получились "!тевирП"

В отличии от многих алгорических задач, требование тут: оптимизировать потребление памяти (т.е. не создавать еще одну строку, куда просто переписаывать символы в обратном порядке

Решение

Общая идея:

  1. Поставить один указатель (left) на начало строки, другой (right) — на конец.
  2. Менять местами символы на позициях left и right.
  3. Сдвигать left вправо, right влево, пока они не встретятся.

Возможная реализация в коде (golang)

package main

import "fmt"

func reverseString(s string) string {
	// Преобразуем строку в срез рун для корректной работы с Unicode
	runes := []rune(s)
	n := len(runes)

	// Меняем местами символы с начала и конца, двигаясь к центру
	for i := 0; i < n/2; i++ {
		runes[i], runes[n-1-i] = runes[n-1-i], runes[i]
	}

	return string(runes)
}

func main() {
	fmt.Println(reverseString("Привет!")) // Вывод: "olleh"
	fmt.Println(reverseString("Golang"))  // Вывод: "oG"
	fmt.Println(reverseString(""))        // Пустая строка: ""
}

-- замечание по синтаксису golang-а: в этом решении мы используем преобразование строки к срезу рун, чтобы проводить обмен символов в строке, а затема финально опять преобразуем результат к строковому типу.

vedro-compota's picture

уточнить реализацию - как тут происходит обмен без затирания значения

_____________
матфак вгу и остальная классика =)