Инвертирование списка номеров и пропуск других [закрыт]

0

Учитывая список и число k, инвертируйте первые k элементов и оставьте следующие k элементов. Повторите это во всем списке. Инвертируя, я имею в виду, меняя знак числа.

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

Я думал о разделении массива на K-Steps, затем инвертировал, пропускал. Затем объедините массивы, как при сортировке слиянием.

Теги:
algorithm

2 ответа

2
Лучший ответ
for (int i=0;i<size;i+=k*2)
    for (int j=0;j<k&&i+j<size;j++)
         arr[i+j]=-arr[i+j];

если вы уверены, что размер массива кратен 2 * k или равен x * 2 * k - k, тогда:

for (int i=0;i<size;i+=k*2)
    for (int j=0;j<k;j++)
         arr[i+j]=-arr[i+j];
  • 0
    Вы думаете, что здесь проще, чем это?
  • 0
    Почему умножение, а не унарное отрицание?
Показать ещё 10 комментариев
2

Сложность решения хэсана:

Поскольку вы сказали, что думаете, что решение hasan - O (N ^ 2), я хотел бы объяснить, почему вы ошибаетесь. Поэтому он предложил:

for (int i=0; i < size; i+=k*2)
    for (int j=0; j < k && i+j < size; j++)
         arr[i+j] = -arr[i+j];

Число итераций для первого цикла - это size/(k * 2) а число итераций для второго цикла - k. Hense, общее число итераций - это size/2. Который также является числом элементов в массиве, которые необходимо изменить. Вы не можете сделать лучше.

  • 0
    Вы можете сделать лучше, чем это. Сложность O (1) на квантовом компьютере.
  • 0
    Я предполагал машину фон Неймана или подобное :). Вы также можете добиться большего успеха с FPGA и фиксированным размером.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню