我最近参加了一次面试,被问到这个问题。让我正确解释这个问题:
给定一个数字 M(N 位整数)和 K 个交换操作(交换操作可以交换 2 个数字),设计一种算法来获得最大可能的整数?
示例:
M = 132 K = 1 个输出 = 312
M = 132 K = 2 个输出 = 321
M = 7899 k = 2 个输出 = 9987
我的解决方案(伪代码中的算法)。我使用最大堆在每个 K 操作中从 N 位中获取最大位,然后适当地交换它。
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) for pop up number from heap & N to get the most right index to swap with]
上面的策略在这个例子中失败了:
M = 8799 and K = 2
按照我的策略,我会在 K=1 之后得到 M = 9798,在 K=2 之后得到 M = 9978。但是,在 K=2 之后,我能得到的最大值是 M = 9987。
我错过了什么?
还建议其他解决问题的方法和优化我的解决方案的方法。