# Занятие 7. Массив: индексы, проходы, границы · C#

Три задачи на один проход по списку. Во всех трёх нужно назвать инвариант
прохода — утверждение, которое остаётся верным после каждого шага цикла, —
и проверить решение на граничных входах.

Обязательная часть — задачи 1 и 3. Задача 2 и полный PR — расширение.

Общие ограничения:

- .NET 8 или новее, C# 12; только `System.Collections.Generic`, без LINQ в решениях;
- сортировка входа запрещена во всех задачах;
- сигнатуры методов в `Solution.cs` не меняются, по ним работают тесты;
- до кода в `initial_attempt.txt` записываются уточняющие вопросы к условию
  и три своих примера «вход → ожидаемый ответ» на задачу.

## Задача 1. Максимальная серия · `MaxStreak`

Фитнес-трекер хранит число шагов по дням: `steps[0]` — первый день, `steps[^1]` — последний.
Цель дня — `goal` шагов, по умолчанию 10 000. Нужно вернуть длину самой длинной
серии дней подряд, в каждый из которых цель достигнута.

| Вход | Ответ |
|---|---|
| `{ 12000, 3000, 11000, 10500, 10000 }` | `3` |
| `{ 9999 }` | `0` |
| `{ }` | `0` |

- Цель считается достигнутой, если шагов **не меньше** `goal`.
- Время O(n), дополнительная память O(1). Входной список не изменяется.

## Задача 2. Разворот участка · `ReverseSegment`

В плейлисте нужно развернуть порядок треков с позиции `l` по позицию `r` **включительно**.
Остальные треки остаются на своих местах. Метод меняет переданный список и ничего не возвращает.

| До | `l, r` | После |
|---|---|---|
| `A B C D E F` | `1, 4` | `A E D C B F` |
| `A B C` | `1, 1` | `A B C` |

- Если не выполнено `0 <= l <= r < tracks.Count`, метод выбрасывает `ArgumentException`
  и не трогает список.
- Время O(r − l), дополнительная память O(1). `List.Reverse`, `Array.Reverse`,
  диапазоны `[l..r]` и LINQ не используются.

## Задача 3. Удаление на месте · `RemoveSpam`

Модерация получает список комментариев и удаляет спам — комментарии со ссылкой
(`IsSpam` уже написан). Нужно удалить спам **из того же списка**, сохранить
порядок остальных комментариев и вернуть их число.

| До | Ответ | Список после |
|---|---|---|
| `{ "Отличный урок", "http://win.ru", "http://prize.ru", "Спасибо" }` | `2` | `{ "Отличный урок", "Спасибо" }` |
| `{ "http://a.ru" }` | `0` | `{ }` |

- Новый список не создаётся: `new List`, `ToList()`, `Where` не используются.
- `Remove`, `RemoveAt` и `RemoveAll` внутри цикла не используются: каждое такое удаление
  сдвигает хвост списка, и решение становится O(n²). `RemoveAll` решает задачу целиком,
  поэтому в решении он тоже не используется.
- Один `RemoveRange(w, comments.Count - w)` после цикла разрешён: он обрезает хвост за одну операцию.
- Время O(n), дополнительная память O(1).

## Что сдаётся

Папка `portfolio/lesson_07/` личного репозитория:

- `Solution.cs` — решения;
- `Tests.cs` — публичные тесты и ваши тесты в блоке «Мои тесты»;
- `complexity_note.md` — заметка по шаблону;
- `initial_attempt.txt` — вопросы и примеры до кода, первая версия решения;
- `ai_usage_note.md` — только если пользовались ИИ: запрос, ответ, что проверили и что изменили.
