我尝试解决这个面试问题。我的代码运行测试用例但是对于所有真正的输入测试用例都失败了。我努力找到错误但却无法做到。请在问题下面找到我的代码
鲍勃非常喜欢排序。他一直在想着对阵列进行排序的新方法。他的朋友拉姆给了他一个具有挑战性的任务。他给Bob一个数组和一个整数K.挑战是在最多K-swaps之后产生字典最小数组。只能交换连续的元素对。帮助Bob在最多K-swaps之后返回字典最小数组。输入:第一行包含整数
T
,即测试用例的数量。T
测试用例如下。每个测试用例有2行。第一行包含N(number of elements in array)
和K(number of swaps)
。第二行包含数组的n
个整数。输出:打印字典最小数组。
约束:
1 <= T <= l0 1 <= N,K <= 1000 1 <= A[i] <= 1000000
样本输入(明文链接)
2 3 2 5 3 1 5 3 8 9 11 2 1
样本输出(明文链接)
1 5 3 2 8 9 11 1
解释
交换1后:
5 1 3
交换2后:
1 5 3
{1,5,3}
在字典上比{5,1,3}
示例2:
交换1:
8 9 2 11 1
交换2:
8 2 9 11 1
交换3:
2 8 9 11 1
#include <iostream>
using namespace std;
void trySwap(int a[], int start, int end, int *rem)
{
//cout << start << " " << end << " " << *rem << endl;
while (*rem != 0 && end > start)
{
if (a[end - 1] > a[end])
{
swap(a[end - 1], a[end]);
(*rem)--;
end--;
}
else end--;
}
}
void getMinimalLexicographicArray(int a[], int size, int k)
{
int start , rem = k, window = k;
for (start = 0; start < size; start++)
{
window = rem;
if (rem == 0)
return;
else
{
//cout << start << " " << rem << endl;
int end = start + window;
if (end >= size)
{
end = size - 1;
}
trySwap(a, start, end, &rem);
}
}
}
int main()
{
int T, N, K;
int a[1000];
int i, j;
cin >> T;
for (i = 0; i < T; i++)
{
cin >> N;
cin >> K;
for (j = 0; j < N; j++)
{
cin >> a[j];
}
getMinimalLexicographicArray(a, N, K);
for (j = 0; j < N; j++)
cout << a[j] << " ";
cout << endl;
}
return 0;
}
答案 0 :(得分:0)
以下是两个失败的测试用例。
2
2 2
2 1
5 3
3 2 1 5 4
在第一个代码中,您的代码不进行交换,因为K&gt; = N.在第二个代码中,当代码应该在3和2上进行第三次交换时,代码会交换5和4。
编辑:新版本仍然太贪心。 的正确输出1
10 10
5 4 3 2 1 10 9 8 7 6
是
1 2 3 4 5 10 9 8 7 6