Я готовлюсь к собеседованию по работе с программным обеспечением, и у меня возникают проблемы с модификациями массива на месте. Например, в проблеме перетасования вы чередуете две половины массива, так что 1 2 3 4 5 6 7 8 станет 1 5 2 6 3 7 4 8. Этот вопрос требует решения постоянной памяти (и линейного времени, хотя я не уверен, что это возможно).
Сначала я думал, что линейный алгоритм тривиальен, но тогда я не мог его решить. Затем я нашел простой алгоритм O(n^2)
, но мне потребовалось много времени. И я все еще не нахожу более быстрое решение.
Я также помню, что у меня возникла проблема с решением аналогичной проблемы из Bentley Programming Pearls, columnn 2: Поверните массив, оставшийся от я позиций (например, abcde, повернутый на 2, станет cdeab), со временем O(n)
и всего с несколькими байтами пространство.
Есть ли у кого-нибудь советы, которые помогают обернуть голову такими проблемами? Существуют ли специальные учебники для таких вопросов? Благодарю!