题目的主要信息:
- 输入一个字符串,统计字符串中各个字母字符的个数
- 要求使用map实现,键的排序使用map默认排序即可
具体做法:
题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个'\0'表示字符串的结束,如果长度小于数组长度,输入所有字符后加'\0',如果长度大于数组长度,截断输入的前面部分再在最后加'\0'。因此我们遍历字符数组第一个字符到最后的'\0'。
要统计字符串中各个字母字符出现的次数,我们自然要遍历哈希表,对于每个字符我们用isalpha()函数检查是否是字母,如果是字母我们再用哈希表计数。
哈希表中记录有两个值,key值唯一标识这个东西,在这里就是我们的每个字母字符,value记录与这个key相关的数量,这里就是该字符出现的次数。全部字符遍历加入到哈希表中以后,我们遍历哈希表输出即可,哈希表依赖于红黑树会对key值按从小到大排序。
#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;
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,对于每个字符,加入哈希表的复杂度为
- 空间复杂度:,大小写字母加起来总共才52个,哈希表大小不会超过这个数,属于常数空间