题目的主要信息:

  • 对字符串进行排序
  • 字符串仅包含字母字符和数字字符

方法一:sort函数快排

具体做法:

sort函数会直接比较字符的ASCⅡ码顺序,然后用快速排序法进行排序。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(){
    string s;
    while(cin >> s){
        sort(s.begin(), s.end()); //sort函数直接排序
        cout << s << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(nlog2n)O(nlog_2n),sort函数的复杂度为O(nlog2n)O(nlog_2n)
  • 空间复杂度:O(1)O(1),无额外空间

方法二:桶排序思想

具体做法:

我们直到字母数字中ASCⅡ码最大的是字母z,为122,那我们准备一个123大小的表,统计每个字符出现的次数,用表的表示ASCⅡ码,即可以表示该字符。遍历字符串,即将字符相应位置在表中的数量加1.

然后我们遍历这个表,对出现次数不为0的我们依次输出,也有可能出现不止一次,因此我们要循环输出,直到这个字符为0,再进入下一个,因为这个表直接有序,所以输出的元素就是有序的。

alt

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main(){
    string s;
    while(cin >> s){
        vector<int> table(123, 0); //统计123个ASCⅡ码出现次数
        for(int i = 0; i < s.length(); i++){ //遍历字符串
            table[s[i]]++; //相应ASCⅡ出现次数加1
        }
        for(int i = 0; i < table.size(); i++){ //遍历桶
            while(table[i] > 0){ //依次输出所有桶中大于1的所有字符
                cout << char(i);
                table[i]--; //如果有多个要输出多次
            }
        }
        cout << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串长度,遍历一次字符串,后续遍历桶也是相当于遍历字符串的长度
  • 空间复杂度:O(1)O(1),桶大小为123,属于常数空间