Contents
  1. 1. 分析:

## 题目大意:

给一个数,一个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; //找到k步之内大于i位置的数的最大值
}
}
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("%d\n", flag);
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;
}
Contents
  1. 1. 分析: