Задача: дана строка
s
и строка p
. Необходимо найти все начальные индексы подстрок в s
, которые являются анаграммами строки p
.Анаграмма — это слово или фраза, образованная перестановкой букв другого слова, используя все исходные буквы ровно один раз.
Пример:
Input: s = "cbaebabacd", p = "abc"
Output: [0, 6]
Объяснение:
Подстрока с индекса 0 - "cba", анаграмма "abc".
Подстрока с индекса 6 - "bac", анаграмма "abc".
Оптимальное решение использует технику скользящего окна с подсчетом частот символов.
1. Подсчитываем количество и частоту всех символов в строке p
2. Создаем скользящее окно размером со строку
p
в строке s
3. Для каждой позиции окна сравниваем частоты символов с эталоном
4. При совпадении добавляем индекс в результат
Код:
public class Solution
{
public IList<int> FindAnagrams(string s, string p)
{
List<int> result = new List<int>();
if (s.Length < p.Length)
return result;
// Массивы для подсчета частот символов (26 букв английского алфавита)
int[] pCount = new int[26];
int[] windowCount = new int[26];
// Подсчитываем частоты в строке p и первом окне
for (int i = 0; i < p.Length; i++)
{
pCount[p[i] - 'a']++;
windowCount[s[i] - 'a']++;
}
// Проверяем первое окно
if (AreEqual(pCount, windowCount))
result.Add(0);
// Скользим окном по строке s
for (int i = p.Length; i < s.Length; i++)
{
// Добавляем новый символ справа
windowCount[s[i] - 'a']++;
// Удаляем старый символ слева
windowCount[s[i - p.Length] - 'a']--;
// Проверяем текущее окно
if (AreEqual(pCount, windowCount))
result.Add(i - p.Length + 1);
}
return result;
}
// Вспомогательный метод для сравнения массивов частот
private bool AreEqual(int[] arr1, int[] arr2)
{
for (int i = 0; i < 26; i++)
{
if (arr1[i] != arr2[i])
return false;
}
return true;
}
}
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩3❤2🔥2💯2👾2
В C# каждое обращение к элементу массива проверяется на выход за границы. Это безопасно, но медленно. Разработчики часто решают проблему через unsafe-код с указателями — быстро, но опасно: один неверный индекс, и приложение крашится или получает дыру в безопасности.
Есть третий путь —
Span<T>
Span — это структура, которая хранит указатель на данные и их длину. Фишка в том, что это ref struct — она живёт только в стеке и не может попасть в кучу. Благодаря этому компилятор гарантирует: данные переживут span, а значит проверки границ можно убрать.
Например, в быстрой сортровке вместо передачи массива с индексами low/high передаёте span. Код короче, переполнение невозможно, а рекурсивные вызовы работают через срезы:
// Было: опасно, (low + high) может переполниться
void Quicksort(int[] array, int low, int high) {
int mid = (low + high) / 2; // 💥 overflow!
// ...
Quicksort(array, low, pivot - 1);
Quicksort(array, pivot + 1, high);
}
// Стало: безопасно и выразительно
void Quicksort(Span<int> span) {
if (span.Length <= 1) return;
int pivot = Partition(span);
Quicksort(span[..pivot]); // левая часть
Quicksort(span[(pivot + 1)..]); // правая часть
}
Раньше для передачи части массива в функцию приходилось либо копировать данные, либо таскать массив + offset + length. Span решает это элегантно: создаёте срез array[10..20], передаёте дальше — никакого копирования, полная безопасность типов.
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17⚡1❤1😁1
🪚 Швейцарский нож для коллекций коллекций
Коллекция коллекций — частая головная боль. Пришли батчи из очереди, загрузили страницы из API, получили результаты от нескольких потоков.
Одна строка вместо циклов и временных списков:
Когда использовать
• Батчи сообщений из Kafka/RabbitMQ → один список для обработки
• Постраничные данные из API → единая коллекция
• Результаты параллельных задач → склеить всё вместе
SelectMany сохраняет порядок. Если у вас [1,2], [3,4], [5,6] — получите [1,2,3,4,5,6]. Критично для событий, логов, приоритетных очередей.
🐸 Библиотека шарписта
#sharp_view
Коллекция коллекций — частая головная боль. Пришли батчи из очереди, загрузили страницы из API, получили результаты от нескольких потоков.
Одна строка вместо циклов и временных списков:
var all = batches.SelectMany(b => b).ToList();
Когда использовать
• Батчи сообщений из Kafka/RabbitMQ → один список для обработки
• Постраничные данные из API → единая коллекция
• Результаты параллельных задач → склеить всё вместе
SelectMany сохраняет порядок. Если у вас [1,2], [3,4], [5,6] — получите [1,2,3,4,5,6]. Критично для событий, логов, приоритетных очередей.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2🥱2
Сегодня Microsoft выпустила последнее обновление для Windows 10. Дальше — тишина: новых патчей безопасности не будет. Через пару недель система станет мишенью для вирусов и хакерских атак.
Есть несколько способов продлить жизнь десятке — от года до нескольких лет.
• Официальная программа ESU — до октября 2026
Microsoft запустила программу расширенных обновлений. Бесплатно, но только на год. Чтобы подключиться:
1. Войдите в учётную запись Microsoft
2. Смените регион на США (для пользователей из России и Беларуси)
3. Проверьте статус через команду в PowerShell
4. Зарегистрируйтесь через Центр обновлений
После активации система получит доступ к патчам безопасности ещё на год.
• LTSC-версия — до января 2027
Корпоративная сборка Windows 10 LTSC (21H2) не получает новых функций, но апдейты безопасности идут до начала 2027 года. Подходит тем, кому нужна стабильность без лишних обновлений.
• TSforge — до 2028 года
Скрипт через PowerShell, который продлевает поддержку ещё на три года. Нужно сменить регион на страну ЕС, запустить команду и активировать ESU через меню. Проверить результат можно через команду в системе.
• 0patch Agent — постоянная защита
Программа, которая ставит микропатчи прямо в код системы. Работает даже после окончания всех официальных обновлений и закрывает уязвимости в реальном времени.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
🤓 Пока Python стал π-thon, ты можешь стать Data Scientist'ом
В Proglib.academy стартует экспресс-курс «Математика для Data Science»: 10 живых вебинаров, практика на Python и спикеры из ВШЭ, Яндекс Практикума и Wildberries, которые всё разложат по полочкам.
В программе:
🔹 матан, линал, теория вероятностей;
🔹 3 практических проекта + викторина с розыгрышем TG Premium;
🔹 поддержка преподавателей и чат с единомышленниками;
🎁 Оплати курс до 19 октября — получи курс по базовой математике в подарок.
🗓️ Старт — 6 ноября
👉 Записаться на курс
В Proglib.academy стартует экспресс-курс «Математика для Data Science»: 10 живых вебинаров, практика на Python и спикеры из ВШЭ, Яндекс Практикума и Wildberries, которые всё разложат по полочкам.
В программе:
🔹 матан, линал, теория вероятностей;
🔹 3 практических проекта + викторина с розыгрышем TG Premium;
🔹 поддержка преподавателей и чат с единомышленниками;
🎁 Оплати курс до 19 октября — получи курс по базовой математике в подарок.
🗓️ Старт — 6 ноября
👉 Записаться на курс
😁2❤1
🔍 50 фраз, из-за которых ваше резюме C#-разработчика летит в корзину
На первый взгляд может показаться, что фраза «пишу чистый код на C#» звучит убедительно и профессионально — но на практике рекрутеры и ATS-системы давно привыкли к таким штампам и игнорируют их как пустые слова.
Помните: каждая строчка в резюме должна отвечать на вопрос «и что?». Если после вашей фразы можно задать этот вопрос — значит, она недостаточно конкретна.
➡️ В статье про все клише, которые стоит убрать из резюме
🐸 Библиотека шарписта
На первый взгляд может показаться, что фраза «пишу чистый код на C#» звучит убедительно и профессионально — но на практике рекрутеры и ATS-системы давно привыкли к таким штампам и игнорируют их как пустые слова.
Помните: каждая строчка в резюме должна отвечать на вопрос «и что?». Если после вашей фразы можно задать этот вопрос — значит, она недостаточно конкретна.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4👍3
💬 Какую систему нумерации версий предпочитаете и встречали ли экзотические варианты? Делитесь опытом👇
#схема
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤2🔥2🥱1
🧐 Хочешь в Data Science, но не знаешь, с чего начать?
Пройди короткий тест по математике — бот покажет, насколько ты готов к переходу и что стоит подтянуть.
👉 Пройти тест
Пройди короткий тест по математике — бот покажет, насколько ты готов к переходу и что стоит подтянуть.
Всего пару минут — и ты поймёшь, куда двигаться дальше.
👉 Пройти тест
😁2🤔1
Когда вы пишете SELECT * FROM users WHERE email = 'user@example.com' без индекса на поле email, база данных выполняет Full Table Scan — последовательно проверяет каждую строку таблицы.
Если в таблице 10 записей — не страшно. Но когда их миллион база читает миллион строк, чтобы найти одну нужную.
Производительность деградирует нелинейно. С ростом данных время выполнения запроса растёт экспоненциально. Запрос, который работал за 10мс на тестовой базе, в продакшене может выполняться минутами.
Как решить проблему
• Добавить индекс
Самое очевидное решение — создать индекс на нужное поле:
CREATE INDEX idx_users_email ON users(email);
• Составные индексы
Если фильтруете по нескольким полям, используйте составной индекс. Порядок полей важен — самое селективное поле должно быть первым:
CREATE INDEX idx_users_status_created ON users(status, created_at);
• Функциональные индексы
Для запросов с функциями создавайте индексы на выражения:
CREATE INDEX idx_users_email_lower ON users(LOWER(email));
• Партиционирование
Для огромных таблиц разбейте данные на партиции по дате или другому критерию — база будет сканировать только нужные партиции, а не всю таблицу.
• Денормализация и кэширование
Иногда проще продублировать данные или закэшировать результаты частых запросов в Redis/Memcached, чем постоянно гонять тяжёлые запросы по базе.
Индексы — не бесплатны. Они занимают место на диске и замедляют INSERT/UPDATE/DELETE операции. Не нужно индексировать всё подряд — создавайте индексы осознанно.
Это уже не «Hello World» писать. Для таких решений нужно знать не только язык. Подтянуть архитектуру можно на нашем интенсиве.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🥱1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁31
🎓 Как вайб-кодинг меняет рынок IT-образования
В карточках разобрали, как университеты и онлайн-школы перестраивают программы под новую реальность, где разработчик становится дирижёром, а не исполнителем.
➡️ Узнать как ИИ меняет обучение
🐸 Библиотека шарписта
В карточках разобрали, как университеты и онлайн-школы перестраивают программы под новую реальность, где разработчик становится дирижёром, а не исполнителем.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
🎲 Мы не только учим, но и играем!
На экспресс-курсе «Математика для Data Science» — викторина с призом TG-Premium 🎁
Проверь знания, прокачай математику и забери приз.
‼️ Оплатишь до 19 октября — получишь базовый курс в подарок.
👉 Записаться на курс
На экспресс-курсе «Математика для Data Science» — викторина с призом TG-Premium 🎁
Проверь знания, прокачай математику и забери приз.
‼️ Оплатишь до 19 октября — получишь базовый курс в подарок.
👉 Записаться на курс
❤1
Microsoft опубликовала второй релиз-кандидат .NET 10. Это значит, что платформа практически готова к официальному выходу, а вы уже сейчас можете протестить её.
Что обновили
— .NET MAUI: разрешения для микрофона, SafeAreaEdges, улучшенная генерация из XAML, Android API 36.1, биндинги Xcode 26.
—Entity Framework Core: фиксы для JSON, миграции без единой транзакции, ExecutionStrategy для retry-логики, предупреждения анализатора при конкатенации строк в raw SQL.
—Остальные компоненты получили только багфиксы.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤3