持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、"a"到"z"、"0"到"9"表示。
数据范围:每组输入的字符串长度满足:1≤n≤1000
输入描述:
一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。
输出描述:
Lily的所有图片按照从小到大的顺序输出
示例1
输入:
Ihave1nose2hands10fingers
输出:
0112Iaadeeefghhinnnorsssv
题目的主要信息:
- 对字符串进行排序
- 字符串仅包含字母字符和数字字符
方法一: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;
}
复杂度分析:
- 时间复杂度:,sort函数的复杂度为
- 空间复杂度:,无额外空间
方法二:桶排序思想
具体做法:
我们知道字母数字中ASCⅡ码最大的是字母z,为122,那我们准备一个123大小的表,统计每个字符出现的次数,用表的表示ASCⅡ码,即可以表示该字符。遍历字符串,即将字符相应位置在表中的数量加1.
然后我们遍历这个表,对出现次数不为0的我们依次输出,也有可能出现不止一次,因此我们要循环输出,直到这个字符为0,再进入下一个,因为这个表直接有序,所以输出的元素就是有序的。
#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(n),其中n为字符串长度,遍历一次字符串,后续遍历桶也是相当于遍历字符串的长度
- 空间复杂度:O(1),桶大小为123,属于常数空间