寻找最小的词典数组

时间:2014-08-28 01:37:31

标签: c++ c arrays algorithm sorting

我尝试解决这个面试问题。我的代码运行测试用例但是对于所有真正的输入测试用例都失败了。我努力找到错误但却无法做到。请在问题下面找到我的代码

  鲍勃非常喜欢排序。他一直在想着对阵列进行排序的新方法。他的朋友拉姆给了他一个具有挑战性的任务。他给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;

}

1 个答案:

答案 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