Учитывая массив [a1b2c3d4] конвертировать в [abcd1234]
Ограничения:
O (1) пробелВовремяЭто не домашнее задание, а интересный вопрос, с которым я столкнулся.
Вот некоторые решения, о которых я мог подумать, но ничего, что могло бы сделать это при данных ограничениях.
Способ 1
* С O (n) памятью *
Разделите массив на две части рекурсивно. (продолжайте делить до размера <= 2 для каждой подзадачи)Сортируйте каждую подзадачу с массивом первым и числами в конце.Слияние массивов подзадачСпособ 2
За O (n log n) время
Сортировать массив на основе лексикографического порядка становится 1234abcdОбратить обе половины массива 4321dcbaПеревернуть всю строку abcd1234Способ 3
Если диапазон чисел был определен
Также, если дело в том, что числа находятся в определенном диапазоне, тогда я могу инициализировать int скажем track = 0; И установить соответствующий бит, когда я сталкиваюсь с числом в массиве, например (1 << а [2]). 1. Поменяйте местами алфавиты на первую половину массива. 2. Пометьте числа в переменной track. 3. Позже используйте track, чтобы заполнить вторую половину массива.
Способ 4 Мы можем использовать метод 3 с HashMap, если мы хотим удалить ограничение диапазона целых чисел, но тогда ему потребуется больше памяти.
Не могу придумать лучшего способа решения общей проблемы в O (1) времени и O (n) пространстве.
Общая проблема здесь относится к:
Дана последовательность x1y1x2y2x3y3 .... xnyn, где x1, x2 - алфавиты x1 < х2 <.... < xn и y1y2 ... yn - целые числа. у1 < у2 <.... < Упорядочить вывод как x1x2 ... xny1y2 ... yn
Какие-либо предложения ?