所以就把第一次的交换拿出来单独考虑,首先贪心查找非零的最小值,然后把最小值和第一位交换,每交换一次,交换次数m--。
后面的也是一样的,贪心查找之后位数的最小值,然后和前面的数进行比较,如果比前面的数小就交换
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
char num[20000];
int len, t, m, k, i, j;
cin >> t;
while (t--)
{
cin >> num >> m;
len = strlen(num);
if (m != 0)//m为1的情况
{
for (i=0, k=0; i<len; i++)
{
if (num[i] < num[k] && num[i] != '0')//比较最小值
{
k = i;
}
}
if (num[0] > num[k])
{
swap(num[0], num[k]);//交换
m--;
}
}
for (i=1; i<len && m != 0; i++)//从第二位开始找
{
for (j=i, k=j; j<len; j++)//查找最小值
{
if (num[j] < num[k])
{
k = j;
}
}
if (num[i] > num[k])
{
swap(num[i], num[k]);//交换
m--;
}
}
cout << num << endl;
}
return 0;
}