главная новое лучшее написать
неделя месяц год вечное
посты пользователи ответы

3 leetcoder 19-12-2024 к записи «Shortest write-up ever!»

Честный разбор с решением, которое не стыдно показать на собеседовании, я всё же сделаю :)

Идея 💡

Задача состоит в том, чтобы разделить массив на максимальное количество блоков, так чтобы сортировка каждого блока и их объединение давали отсортированный массив. Ключевая идея заключается в том, что элементы из одного цикла перестановки

arr1arr2arr3 → ... → arrnarr1

обязательно должны находиться в одном блоке, так как они взаимозависимы.

Описание подхода 🛠️

  1. Создаём массив chunk_assignment, чтобы отслеживать принадлежность каждого индекса к определённому блоку.
  2. Используем функцию assign_chunk для рекурсивного назначения всех индексов, связанных с текущим индексом, в один блок. Она:
    • Обновляет максимальный индекс текущего блока.
    • Помечает все посещённые индексы текущим номером блока.
  3. Внешний цикл:
    • Перебирает индексы массива.
    • Увеличивает счётчик блоков при обнаружении нового блока.
    • Завершает обработку текущего блока, когда все его элементы покрыты.
  4. Возвращаем общее количество блоков

Асимптотика 📊

Исходный код решения 📜

impl Solution {
    pub fn max_chunks_to_sorted(arr: Vec<i32>) -> i32 {
        let n = arr.len();
        let mut chunk_assignment = vec![0; n]; // Tracks which chunk each index belongs to
        let mut chunk_count = 0; // Counter for the number of chunks

        // Helper function to assign indices to a chunk
        let mut assign_chunk = |start_idx: usize, chunk: i32, max_idx: &mut usize| {
            let mut current_idx = start_idx;
            while chunk_assignment[current_idx] == 0 {
                *max_idx = (*max_idx).max(current_idx);
                chunk_assignment[current_idx] = chunk;
                current_idx = arr[current_idx] as usize;
            }
        };

        let mut start_idx = 0;
        while start_idx < n {
            chunk_count += 1; // Start a new chunk
            let mut max_idx = start_idx;

            // Process the current chunk until all related indices are covered
            loop {
                assign_chunk(start_idx, chunk_count, &mut max_idx);
                if start_idx == max_idx {
                    break; // The current chunk is complete
                }
                start_idx += 1; // Move to the next index
            }
            start_idx += 1; // Move to the next unprocessed index
        }

        chunk_count // Return the total number of chunks
    }
}
перейти
2 leetcoder 03-12-2024 к записи «Эффективное добавление пробелов в строку 🚀»

Ещё один простой вариант решения - собрать все слайсы, отвечающие словам в одну коллекцию и проджойнить стандартными средствами через пробел.

impl Solution {
    pub fn add_spaces(s: String, spaces: Vec<i32>) -> String {
        // Convert indices to usize
        let mut spaces: Vec<usize> = spaces.into_iter().map(|s_pos| s_pos as usize).collect();

        // Add the start (0) and end (s.len()) boundaries to spaces
        spaces.insert(0, 0);
        spaces.push(s.len());

        // Create slices from spaces indices
        let slices: Vec<&str> = spaces.windows(2)
            .map(|window| &s[window[0]..window[1]])
            .collect();

        // Join the slices with spaces
        slices.join(" ")
    }
}

В этом коде есть один грустный момент - необходимость создания промежуточного вектора из слайсов исходной строки.
К сожалению, join из стандартной библиотеки позволяет только такое использование.
Но, если мы не ограничеы стандартной библиотекой, то крейт itertools спешит нам на помощь ;)

перейти
 в ответ на чей-то комментарий к записи «Shortest write-up ever!»

 в ответ на чей-то комментарий к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

2 kitesh 17-12-2024 к записи «Посвящается Сепиру и Уорфу»

Кажется что мы разговариваем на сильно разных английских.

По моему опыту:
- slayer вышел из употребления, последние пару раз я видел это слово в названии группы
- triggerman, manslayer вообще ни разу в жизни не встречал
- cutthroat до сегодняшнего дня был уверен что это исключительно прилагательное
- insecurity имхо к ревности имеет крайне опосредованое отношение, оно скорее про низкую самооценку и недостаток признания
- intelligentsia видел только применительно к СССР, в дискуссиях о США это скорее cultural elite/educated class/chattering class

перейти
2 finder 19-12-2024 к записи «Shortest write-up ever!»

Я освободил свой разум и понял первое решение. По-моему, его не стыдно и на собесе написать (разве что не в таком стиле, а циклом), оно не эзотерическое.

перейти
2 finder 17-12-2024 к записи «Жадная сборка строки с ограничениями 😊»

Интересно, в каких компаниях такие ужасы спрашивают. У меня платного leetcode нет, не подскажешь, если у тебя есть, конечно?

перейти
2 finder 10-12-2024 к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

А в Rust нет аналога std::nth_element? Можно было бы от klogk избавиться (не то чтобы это на практике очень важно, конечно)

перейти
 в ответ на чей-то комментарий к записи «Посвящается Сепиру и Уорфу»

1 heni 13-12-2024 к записи «Пятница, 13-е, чудовища из зазеркалья»

Выглядит как хайп ради хайпа. Также как было с микро черными дырами от Большого Андронного Коллайдера.

То, что бактерию никто не сможет съесть вообще не означает, что она будет размножаться свободно. Как минимум конкурентная борьба за ресурсы с более приспособленными к борьбе обычными бактериями её сильно ограничит.
Ну и касательно ресурсов. Такая бактерия, как я понимаю, скорее всего будет хемотрофной, а вот для современных хемотрофов ниши весьма специфичны - ни разу не серая слизь по описанию.

перейти
1 leetcoder 02-12-2024 к записи «🔍 Найти слово по префиксу!»

Даже в этом решении, если заглянуть глубже split_whitespace не массив слайсов возвращает, а итератор по ним
sruct.SplitWhitespace. В спецификации его характеристики по дополнительной памяти не уточняются, но вполне возможно реализовать такой итератор на константных костах. И можно обсудить как сделать итератор с такими гарантиями самостоятельно.

перейти
 в ответ на чей-то комментарий к записи «Shortest write-up ever!»

1 anonymous 01-12-2024 к записи «💡 Проверка существования элемента совместно со своим удвоением»

Ненавижу такие задачи. Алгоритмически она тривиальная, но, конечно же, в условиях таймпрессинга я с какой-то вероятностью забуду про спецслучай нуля. Это ничего не говорит не только о моем умении программировать, но даже о моем умении решать литкод. Да, в жизни тоже бывают спецслучаи, про которые нельзя забывать, и это часть работы. Но не такие!

перейти
 в ответ на чей-то комментарий к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

 в ответ на чей-то комментарий к записи «Очередь с приоритетами для оптимальной подгонки среднего уровня студентов 🎯»

1 finder 16-12-2024 к записи «Очередь с приоритетами для оптимальной подгонки среднего уровня студентов 🎯»

Для максимизации среднего соотношения нужно жадно добавлять студентов

Почему? Это совершенно не очевидное математически утверждение. У нас тут какая-то очень ядреная функция от n переменных, почему жадным методом мы придем в её глобальный минимум, а не в локальный?

перейти
1 anonymous 02-12-2024 к записи «🔍 Найти слово по префиксу!»

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

перейти
1 finder 01-12-2024 к записи «Сертификат протух?»

Хм, здесь появилась жизнь! Сертификат обновил =)

перейти
 в ответ на чей-то комментарий к записи «Пятница, 13-е, чудовища из зазеркалья»

 в ответ на чей-то комментарий к записи «Эффективное добавление пробелов в строку 🚀»

 в ответ на чей-то комментарий к записи «🔍 Найти слово по префиксу!»

 в ответ на чей-то комментарий к записи «Пятница, 13-е, чудовища из зазеркалья»

 в ответ на чей-то комментарий к записи «🔍 Найти слово по префиксу!»

 в ответ на чей-то комментарий к записи «Shortest write-up ever!»

 в ответ на чей-то комментарий к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

 в ответ на чей-то комментарий к записи «Жадная сборка строки с ограничениями 😊»