所以就把第一次的交换拿出来单独考虑,首先贪心查找非零的最小值,然后把最小值和第一位交换,每交换一次,交换次数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; }