题解
最大字符串
1 条题解
-
0
P4684 最大字符串(入门)
解题思路
第一步,理解规则。 题目问:把一个字符串的字符重新排列,怎样排得到的字符串最大?提示说"ASCII 码值大的字符越靠左,字符串越大"。所以只要把所有字符按 ASCII 码从大到小排好,再连起来,就是答案。
第二步,求长度。 把字符串读进字符数组 str,用 while 循环数出它的长度 len:遇到字符串结尾的空字符 '\0' 就停。
第三步,排序。 sort(str, str + len) 也能对字符数组排序,因为它是按 char 类型的数值(也就是 ASCII 码)来比较大小的。排序后字符是从小到大排列的。
第四步,倒序输出。 从最后一个字符 str[len-1] 倒着输出到第一个字符 str[0],就实现了从大到小排列。注意下标从 len-1 走到 0,不要多输出字符串结尾的空字符。
用例子验证。 字符串 "alex" 里四个字符的 ASCII 码分别是 a(97)、l(108)、e(101)、x(120),从大到小排列是 x(120)、l(108)、e(101)、a(97),连起来得到 "xlea",和样例输出一致。再比如 "abc" 排序后倒序输出 "cba",正好是最大的排列。
想一想生活里的例子。 把字符看成一群小朋友,谁的"ASCII 码值"大,谁就站到队伍最前面。
边界情况: 字符串长度不超过 50,数组开 str[55] 足够;输入不含空格,用 cin 直接读入即可。
参考代码
// P4684 最大字符串:把字符串中的字符按ASCII码从大到小排列,得到能组成的最大字符串 #include <iostream> #include <algorithm> using namespace std; int main() { char str[55]; cin >> str; int len = 0; while (str[len]) len++; // 求字符串长度 sort(str, str + len); // 按ASCII码从小到大排序 for (int i = len - 1; i >= 0; i--) { // 倒序输出,就是从大到小 cout << str[i]; } cout << endl; return 0; }复杂度分析
对 len 个字符排序,时间复杂度 O(len log len)。len 最大只有 50,排序开销可以忽略。求长度和倒序输出都是 O(len) 的循环。空间复杂度 O(len)。
- 1