By
    
      yusijia
    
  
    
    Updated:
    
  
	
		
		
		
		
		## 题目大意:
给一个数,一个k,k次交换(只能相邻交换)后使这个数最大
分析:
  设一个指针指向起点,然后另一个指针从起点往后走k步找比起点里的值大的最大值插入到起点的前面,
这里由于题目数据小,直接让数组整体后移来实现插入就ok了,另一个思路:如果数据大的话,用双向
链表来实现插入删除会快些
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   |  #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std;
  const int MAXN = 1017;
  char str[MAXN];
  void solve(int k) {     int flag = -1, maxs;     int len = strlen(str);     for(int i = 0; i < len; i++)if(k){         flag = -1;         maxs = str[i];         for(int j = i; j <= i + k && j < len; j++){             if(str[j] > maxs){                 maxs = str[j];                 flag = j;			             }         }         if(flag != -1){				             int tmp = str[flag];             for(int index = flag; index > i; index--)                 str[index] = str[index - 1];             str[i] = tmp;             k = k - (flag - i);         }     }          printf("%s\n", str); }
  int main() {     int T, k = 0;     scanf("%d", &T);     while(T--){         scanf("%d", &k);         scanf("%s", str);         solve(k);     }     return 0; }
 
  |