1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...

c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...

时间:2023-09-19 19:44:57

相关推荐

c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...

点击蓝字关注我哦

以下是本期干货视频视频后还附有文字版本哦▼《名企高频考点-如何使用map统计字符串各个字符出现的次数》▼ps:请在WiFi环境下打开,如果有钱任性请随意有某公司这样一道笔试题:题目:由键盘录入一个字符串,统计每个字符出现的次数例如:录入”bbabbccaacbbc”,输出a出现3次,b出现6次,c出现4次1.误区解法

#includeint main(){int count[256] = { 0 }, i; char buf[500]; gets(buf); for (i = 0; i < strlen(buf); i++) {//统计字符出现的次数 if ((buf[i] >= 'A'&&buf[i] <= 'Z') || (buf[i] >= 'a'&&buf[i] <= 'z'))count[buf[i]]++; } for (i = 0; i < 256; i++) {if(count[i] != 0)printf("%c : %d\n", i, count[i]); } return 0;}

误区所在

很多同学会认为字符串中只会有字母

字母只会出现小写字母,所以判断时有可能只考虑小写字母的判断

事实上,此题凡是出现在字符串中的字符,包括字母、特殊符号,比如@、标点符号等,都应该进行统计

2.常规hash求解法

#includeint main(){int count[256] = { 0 }; //用于存储对应字符的次数 char buf[500]; gets(buf); for (int i = 0; i < strlen(buf); i++) {//利用字符的ascii值作为下标,对相应字符进行出现的次数统计 count[buf[i]]++; } for (int i = 0; i < 256; i++) {if(count[i] != 0)printf("%c : %d\n", i, count[i]); //输出对应的字符和相应次数 } return 0;}

pair是一个结构体,其成员属性默认为共有的,所以可以对其成员first和second直接进行访问。3. 利用map进行统计3.1 思路一:先创建一个map,遍历字符串,逐个判断如果存在则 count++,不存在则创建一个,让其value为1。

#include#include#includeusing namespace std;int main() {std::string str; std::map<char, int> map_s; while (cin >> str) {for (int i = 0; i < str.length(); ++i) {//查找字符auto it = map_s.find(str[i]);if (it != map_s.end()) {//如果iter返回不是是map_s.end()表示找到了,则出现次数加1 it->second++;}else {//如果找不到就添加一个字符,并初始化次数为1 map_s.insert(pair<char, int>(str[i], 1));} } //输出各字符以及相应出现的次数 auto it = map_s.begin(); while(it != map_s.end()) {std::cout<first<<" : "<second<<std::endl;++it; } //清除上一次统计的结果 map_s.clear(); }}

3.2 思路二:利用map的唯一性,通过插入失败来增加字符的个数,如果插入失败则表明map中 存在该字符,count++即可。

#include#include#includeusing namespace std;int main() {string str; map<char, int> map_s; while (cin >> str) {pair<map<char, int>::iterator, bool> ret; //map的返回值类型 for (int i = 0; i < str.length(); ++i){ret = map_s.insert(pair<char, int>(str[i], 1));if (ret.second == false) {//如果插入失败,则表明map中已经有该字符,则该字符出现的次数加1 ret.first->second++;} } auto it = map_s.begin(); while(it != map_s.end()){cout <first<<" : "<second<<endl;++it; } //清除上一次统计的结果 map_s.clear(); }}

3.3 思路三:直接使用库里提供的[]运算符重载。通过键值找节点,直接给实值+1,此时无论键值是否存在。

#include#include#includeusing namespace std;int main() {string str; map<char, int> map_s; while (cin >> str) {for (int i = 0; i < str.length(); ++i){//利用[]查找字符,如果存在则加1,不存在则构造新的键值对进行map插入map_s[str[i]]++; } auto it = map_s.begin(); while(it !=map_s.end()){cout<first<<" : "<second<<endl;++it; } //清除上一次统计的结果 map_s.clear(); }}

有些同学对思路三不是很理解,现对其补充说明:假设一个map对象map_s中只存在一对pair('a',1),现在执行map_s['b'],则map_s中存在两对pair分别是('a',1),('b',0)。'b'的value默认是0,那么如果刚才执行的不是map_s['b'],而是map_s['b']++,那么map_s中的两对pair为('a',1)和('b',1),理解为插入‘b’,然后value值++,所以,map_s['b']++这个语句的理解如下:如果map_s中不存在key为‘b’的元素,那么在map_s中添加‘b’,value默认为0,然后map_s['b']++,value变成1。如果map_s中存在key为 'b' 的元素,那么该语句表示map_s['b']的value++。小结小题目,大智慧,有时解决一个问题只需换个思路,大部分同学首先想到的就是既然要统计字符个数,那就直接遍历字符串,暴力统计即可,如果能够恰到好处的使用容器,才深切体会到容器的好处。一般笔试面试题中,题目都会有个比较巧妙的解法,所以本小节以点带面,希望能激发同学们的智慧。作者:鲍松山审稿:王海斌编辑:啊琛琛

好看,就要点个"在看"

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。