【算法题解】图片整理

73 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}

复杂度分析:

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

方法二:桶排序思想

具体做法:

我们知道字母数字中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,属于常数空间