目录
题目
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
题目链接
排序 - 蓝桥云课 (lanqiao.cn)
https://www.lanqiao.cn/problems/598/learning/
提交结果截图
题目详细分析
- 【正序逆序判断】虽然题目没说是正序还是逆序,但是根据“对于字符串 lan 排序,只需要 1 次交换”,我们可以很容易指的是正序排序(正序排序需要1次交换成为'aln',而逆序交换需要2次交换才能成为‘nla’)。
- 【找规律】计算当字符串m长度为n时正序排序需要的最大次数c。要想正序排序所需的次数最大,当然是完全逆序的字符串了!-->我们只需要计算完全逆序的字符串正序排序所需的次数就可以找到规律了!当n = 1时,c = 0;当n = 2时,c = 1(如m = "ba"); 当n = 3时,c = 1+2(如m = "bac");...;故规律为
- 【得出结果】当n = 14时,c = 91,当n = 15时,c = 105,故至少需要n = 15,即字符串长度至少需要15。而完全逆序时为(14 13 12 11 10 9 8 7 6 5 4 3 2 1 0)(用0代表a,1代表b,以此类推,这样可以避免出错),要让次序少5次即可得到100次,而有要让结果的字典序最小,当然是尽量降低最高位的字母的字典排序了!故顺序应该是(9 14 13 12 11 10 8 7 6 5 4 3 2 1 0)。
- 【输出结果】写一个简单的程序,用数组存储排序顺序,通过转换成字母输出,这样可以避免出错!
源代码
#include <iostream>
using namespace std;
char alp(int x)
{
char res = x + 'a';
return res;
}
int main()
{
int N[15] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 9};
for(int i = 14; i >= 0; i--)
cout<<alp(N[i]);
return 0;
}
答案
jonmlkihgfedcba