题目的主要信息:

  • 输入一个字符串,统计字符串中各个字母字符的个数
  • 要求使用map实现,键的排序使用map默认排序即可

具体做法:

题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个'\0'表示字符串的结束,如果长度小于数组长度,输入所有字符后加'\0',如果长度大于数组长度,截断输入的前面部分再在最后加'\0'。因此我们遍历字符数组第一个字符到最后的'\0'。

要统计字符串中各个字母字符出现的次数,我们自然要遍历哈希表,对于每个字符我们用isalpha()函数检查是否是字母,如果是字母我们再用哈希表计数。

哈希表中记录有两个值,key值唯一标识这个东西,在这里就是我们的每个字母字符,value记录与这个key相关的数量,这里就是该字符出现的次数。全部字符遍历加入到哈希表中以后,我们遍历哈希表输出即可,哈希表依赖于红黑树会对key值按从小到大排序。

alt

#include <iostream>
#include <map>
using namespace std;

int main() {
	char str[100] = { 0 };
	cin.getline(str, sizeof(str));
    map<char, int> mp;
    for(int i = 0; str[i] != '\0'; i++){ //遍历字符串
        if(isalpha(str[i])) //对于是字母的字符
            mp[str[i]]++; //加入哈希表,并统计次数
    }
    for(auto iter = mp.begin(); iter != mp.end(); iter++) //遍历哈希表
        cout << iter->first << ":" << iter->second << endl; //输出key与value
	return 0;
}

复杂度分析:

  • 时间复杂度:O(nlog2n)O(nlog_2n),其中nn为字符串长度,对于每个字符,加入哈希表的复杂度为O(log2n)O(log_2n)
  • 空间复杂度:O(1)O(1),大小写字母加起来总共才52个,哈希表大小不会超过这个数,属于常数空间