leetcode | C++ | 189 Rotate Array | задача повернуть массив из Top Interview 150

Поделиться
HTML-код
  • Опубликовано: 10 янв 2024
  • Есть такой сайт leetcode, где можно найти задачи с разных собеседований.
    Выбираете проблему, читаете описание, внимательно изучаете примеры.
    Выбираете язык программирования и вставляете свою реализацию в подготовленную функцию.
    Далее можно запустить тесты и отправить на сервер для проверки, он покажет место в рейтинге, которое занял Ваш код по памяти и производительности.
    leetcode.com/
    leetcode.com/problems/rotate-...
    Задача из Top Interview 150
    189. Дан массив с целыми числами. Необходимо повернуть его направо на к шагов, где к - неотрицательное число.
    #cpp
    #leetcode
    #leetcodesolutions

Комментарии • 21

  • @user-wy5bv2lw8s
    @user-wy5bv2lw8s 5 месяцев назад +3

    Вы чего? обычный циклический сдвиг поворотом называете??? капешник какой-то … жертвы егэ не иначе

  • @BobiBobObana
    @BobiBobObana 5 месяцев назад

    Прикольно. Спасибо

  • @glasderes
    @glasderes 5 месяцев назад +2

    У меня есть более интересный метод решения, но он для тех кто любит опасность, мы меняем указатель на мисив на n шагов, голуву записываем в конец, и надеемся что нечего критически важного не сломалось

    • @glasderes
      @glasderes 5 месяцев назад

      @@xkjeiw93uqj нет, сдесь я и написал про опасность, ты берёшь и меняешь указатель памяти на 4 байта (ну если ты используешь числа char) и в конце дописываешь голову, ты выходишь за границы масива в этом и заключается опасность

    • @glasderes
      @glasderes 5 месяцев назад

      Я немного не понял задачу но суть это не меняет мы двигаемся указатель в другую сторону и хвост перетаскиваем в перед

    • @DariaEmacs
      @DariaEmacs  5 месяцев назад

      Должно работать на массиве [1,2] и k = 5 и выход должен быть [2,1]. Величина k может быть больше, чем длина массива.

  • @minma123
    @minma123 5 месяцев назад

    познавательно

  • @excommunicado2932
    @excommunicado2932 5 месяцев назад

    Еще есть std::rotate.
    Кажется, что можно за 1 вызов STL осуществить указанное.
    А именно std::rotate(v.begin(), v.begin( ) + 3, v.end( ));

    • @DariaEmacs
      @DariaEmacs  5 месяцев назад

      Для работы - да, а тут вопрос с собеседования, думаю, они захотят увидеть подробный алгоритм реализации. std::rotate вряд ли реализуешь сходу, а вот std::reverse это почти swap, который легко реализовать.

    • @drkslfr
      @drkslfr 5 месяцев назад

      ​​@@DariaEmacsкак раз хотел оставить комментарий насчёт собеседования. Тут нужно общаться конкретно с интервьюером, что он думает на этот счет. Потому что использование уже готового решения в виде std::reverse их тоже могут не устроить. Вот)
      А так, поход интересный.
      Почему только это называется поворотом справа? Куда понятнее циклический сдвиг вправо. И объяснений лишних не нужно) но это уже к авторам задачи

  • @user-tw3ri4uy5b
    @user-tw3ri4uy5b 5 месяцев назад

    Сомневаюсь что reverse самый быстрый способ.
    Быстрее всего через новый массив и 2 memcpy.

    • @DariaEmacs
      @DariaEmacs  5 месяцев назад

      Самый быстрый из методов, которые расходуют память O(1).

  • @OurGamesInc
    @OurGamesInc 5 месяцев назад

    А сложность самого метода reverse какая?

    • @DariaEmacs
      @DariaEmacs  5 месяцев назад

      Exactly std::distance(first, last) / 2 swaps.
      Я ее уже посчитала в O(n)

  • @skarty7672
    @skarty7672 5 месяцев назад

    А через цикл и функцию swap, или ее нету у массива, не оч помню
    Идея что-то подобное написать, про эффективность не могу ничего сказать
    #define s 15
    // s - размерность массива
    //...
    for(int i=0; i

    • @DariaEmacs
      @DariaEmacs  5 месяцев назад

      Должно работать на массиве [1,2] и k = 5 и выход должен быть [2,1]. Величина k может быть больше, чем длина массива. У Вас выйдет за границы массива. И в цикле, кажется, что-то не так. Обмениваются одни и те же значения mass[s].

    • @skarty7672
      @skarty7672 5 месяцев назад +1

      @@DariaEmacs ой, опечатка в клаве там swap(mass[i], mass[s])
      А нет, оно все равно не работает

    • @plur_ndbn
      @plur_ndbn 5 месяцев назад +1

      ​@@skarty7672потому что поворот массива на 1 это не смена первого и последнего элемента местами, а первый становится вторым, второй - третьим и т.д. и потом последний становится первым, то есть надо свапать все элементы массива для каждого K, для к = 4 нужно просвапать K * S раз, указанный алгоритм будет свапать фиксированно 2 * S раз

  • @MrOzon1res
    @MrOzon1res 5 месяцев назад

    Эту хрень можно и без цикла сделать, с 3 переменной массива

    • @DariaEmacs
      @DariaEmacs  5 месяцев назад

      На массиве [1,2] и k = 5 и выход должен быть [2,1], получится с 3 переменной?

    • @GrigoriySokolik
      @GrigoriySokolik 5 месяцев назад

      @@DariaEmacs, k может быть больше nums.size()? тогда и с арифметикой указателей решение должно работать немного иначе. Но вообще, решение крутое, хоть и контр-интуитивное. Интуитивно хочется сделать nums.size() свапов, а не 2*nums.size() свапов. Ассимптотика та же, но разница может оказаться существенной.