Недавно я прошел собеседование и был задан этот вопрос. Позвольте мне правильно объяснить вопрос:
Учитывая число M (N-разрядное целое число) и число K операций свопинга (своп операция может поменять 2 цифры), разработать алгоритм для получения максимального значения возможное целое число? Примеры:
M = 132 K = 1 выход = 312
M = 132 K = 2 выход = 321
M = 7899 k = 2 выход = 9987
Мое решение (алгоритм в псевдокоде). Я использовал максимальную кучу, чтобы получить максимальную цифру из N-цифр в каждой из K-операций, а затем ее подходящую замену.
for(int i = 0; i<K; i++)
{
int max_digit_currently = GetMaxFromHeap();
// The above function GetMaxFromHeap() pops out the maximum currently and deletes it from heap
int index_to_swap_with = GetRightMostOccurenceOfTheDigitObtainedAbove();
// This returns me the index of the digit obtained in the previous function
// .e.g If I have 436659 and K=2 given,
// then after K=1 I'll have 936654 and after K=2, I should have 966354 and not 963654.
// Now, the swap part comes. Here the gotcha is, say with the same above example, I have K=3.
// If I do GetMaxFromHeap() I'll get 6 when K=3, but I should not swap it,
// rather I should continue for next iteration and
// get GetMaxFromHeap() to give me 5 and then get 966534 from 966354.
if (Value_at_index_to_swap == max_digit_currently)
continue;
else
DoSwap();
}
Сложность времени: O (K * (N + log_2 (N)))
//K -times [log_2 (N) для вывоза числа из кучи и N, чтобы получить самый правый индекс для обмена с]
Вышеупомянутая стратегия не работает в этом примере:
M = 8799 и K = 2
Следуя моей стратегии, я получу M = 9798 после K = 1 и M = 9978 после K = 2. Однако максимум, который я могу получить, равен M = 9987 после K = 2.
Что я пропустил?
Также предлагаем другие способы решения проблемы и способы оптимизации моего решения.