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

Задача:

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

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

Решение

Общая идея:

Мьютексы - что это в программировании

Мьютекс (переводится с англ. mutex, от mutual exclusion — «взаимное исключение») - механизм, позволяющий параллельном выполнении кода временно заблокировать (/получить эксклюзивные права на) выполнение какой-то части кода одним процессом/потоком для доступа из параллельных процессов/потоков, чтобы избежать состояния гонки.

#20.6 golang mutex Мьютексы - Логика работы, примеры, sync.RWMutex, использование в структуре

Golang поддерживает механизм мьютексов.

Для чего мьютексы используются на практике

Обычно мьютекс - это возможность гарантировать, что только одна горутина будет иметь доступ к какому-то ресурсу (на чтение/запись или на то и на то), что, как и в других языках, помогает уйти от состояния гонки между горутинами.

#20.? golang go tun -race Обнаружение состояние гонки средствами компилятора - WARNING: DATA RACE

Обнаружение гонки данных

Чтобы обнаружить гонку данных при многопоточном выполнении средствами golang-а, можно запустить программу с флагом -race, например:

go run -race test.go 

где test.go - имя файла с исходным кодом

Например, если мы запустим такой код:

#20.5 golang cap() и len() для Каналов - определяем длину и вместимость

Ранее мы уже говорили про функции cap() и len() для срезов, а для каналов они работают следующим образом:

  • cap() - возвращает размер буфера канала
  • len() - возвращает реальное количество данных в буфере

Как мы помним, каналы могут быть буферизированными и небуферизированными, так вот для канала без буфера и len() и cap() всегда равны нулю (в силу отсутствия там буфера)

Рассмотрим пример для буферизированного канала:

Фотография "Комбат" (Ерёменко) закрыта рекламой - Ликвидация оформления моста памяти Великой Отечественной, Автовокзал Воронеж

Мой товарищ обратил внимание на интересную ситуацию: воронежская администрация провела очень странный перфоманс в ходе которого продемонстрировала явно "нетрадиционное" отношение к памяти о Великой Отечественной Войне, и этот перфоманс проходит в несколько этапов:

#20.4 golang select Горутины и первая выполненная операция с каналом - case, default

Select - выбор первой завершенной горутины

Оператор select позволяет остановить выполнение текущей горутины, до момента пока для одного из вариантов case не удастся совершить "коммуникационную операцию" (channel communication operation) с каналом, а именно:

#20.3 golang Закрытие каналов - close() range()

Закрывать каналы следует, когда отправитель данных завершил свою работу и больше не планирует отправлять значения.

Для закрытия канала используется вызов:

 close(имяКанала)

Если количество данных, которое должно попасть в канал получателю неизвестно, то закрытие канала служит сигналом для получателя, что можно переставать читать, например:

golang "Ссылочные" типы данных - срезы, хэш-таблицы, каналы. Неявная передача указателя в функции

В golang нет ссылок, но есть указатели, тем не менее, поведение рассматриваемых тут типов очень похоже на поведение "ссылочных типов" в других языках.

К "ссылочным" (условно говоря) типам данных в golang-е можно отнести всё те же:

Задача «Сумма двух» - разбор алгоритмической задачи

Задача «Сумма двух» (Two Sum) — это классическая алгоритмическая задача, которая обычно формулируется так:

список чисел, найти порядковые номера (индексы) двух чисел из этого списка, которые в сумме дают заданное число-цель (target)

Например, для чисел:

2, 3, 7, 11, 15}

и целевого числа 9
ответ будет:

2 и 7

Оптимальное решение

Цель задачи - получить сложность O(N), относительно чтения массивы, т.е. линейную сложность

Главная идея:

Pages

Subscribe to fkn+antitotal RSS