共48道题,当前是第43

初赛真题

01 #include<cstdio>
02 #include<cstring>
03 using namespace std;
04 int main() {
05     char str[60];
06     int len, i, j, chr[26];
07     char mmin = 'z';
08     scanf("%s", str);
09     len = strlen(str);
10     for (i = len - 1; i >= 1; i--)
11         if (str[i - 1] < str[i]) break;
12     if (i == 0) {
13         printf("No result!\n");
14         return 0;
15     }
16     for (j = 0; j < i - 1; j++) putchar(str[j]);
17     memset(chr, 0, sizeof(chr));
18     for (j = i; j < len; j++) {
19         if (str[j] > str[i - 1] && str[j] < mmin)
20             mmin = str[j];
21         chr[str[j] - 'a']++;
22     }
23     chr[mmin - 'a']--;
24     chr[str[i - 1] - 'a']++;
25     putchar(mmin);
26     for (i = 0; i < 26; i++)
27         for (j = 0; j < chr[i]; j++)
28             putchar(i + 'a');
29     putchar('\n');
30     return 0;
31 }

1. A。
2. A。
3. B。
4. A。
5. B。
6. D。

这段代码一个对字符串的转化,首先后往前找到一个相邻的满足 $str[i-1] < sir[i]$ 的 $i$ ,然后将 $str[0..i-2]$ 都输出,再将 $str[i-1..len-1]$ 排序输出,但是在 $str[i-1]..len-1$ 这段区间中大于 $str[i-1]$的最小值会先被输出,不参与排序。代码这里的排序是通过桶排序来实现的。

Question

1. 输入的字符串长度应该在 [1,59] 的范围内。( )

2. 如果输入的字符数组所有字符都是从大到小的,那么会输出 No result! 。( )

3. 第 25 行输出的值为输入字符串里的 ASCII 最小的那个字符。( )

4. 第 26 行到第 28 行是把 chr[] 数组中存在的对应字符按照从小到大输出,即把剩下未输出的字符按照从小到大输出。( )

5. 如果输入的是 abcdzdcba ,则第 16 行输出的是 ( )。

6. 如果程序的输出结果是 fhhggh ,则输入有可能是 ( )。