Реализуйте кольцевой буфер — очередь FIFO на массиве фиксированного размера.
Память выделяется один раз в конструкторе, дальше Put и Take работают за O(1)
и ничего не аллоцируют.
type RingBuffer struct {
// ...
}
// NewRingBuffer создаёт буфер ёмкостью capacity (capacity >= 1).
func NewRingBuffer(capacity int) *RingBuffer
// Put кладёт item в конец очереди. Если буфер полон, ничего не делает и возвращает false.
func (b *RingBuffer) Put(item int) bool
// Take достаёт элемент из начала очереди. Если буфер пуст — (0, false).
func (b *RingBuffer) Take() (val int, ok bool)
// Len — сколько элементов сейчас в буфере.
func (b *RingBuffer) Len() int
Пример
b := NewRingBuffer(2)
b.Put(1) // true
b.Put(2) // true
b.Put(3) // false — полон
b.Take() // 1, true
b.Put(3) // true — встал на освободившееся место
b.Take() // 2, true
b.Take() // 3, true
b.Take() // 0, false
Ограничения
1 ≤ capacity ≤ 10⁷, число операций до 10⁷.
Put, Take, Len — O(1), без аллокаций. Сдвигать элементы при Take нельзя.
- Потокобезопасность не требуется.
Устно: в исходной версии задачи методы были объявлены как func (b RingBuffer) Put(...).
Что с этим не так?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.