點擊藍字關注我哦
以下是本期干貨視頻視頻后還附有文字版本哦▼《名企高頻考點-如何使用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++。
小結小題目,大智慧,有時解決一個問題只需換個思路,大部分同學首先想到的就是既然要統計字符個數,那就直接遍歷字符串,暴力統計即可,如果能夠恰到好處的使用容器,才深切體會到容器的好處。一般筆試面試題中,題目都會有個比較巧妙的解法,所以本小節以點帶面,希望能激發同學們的智慧。作者:鮑松山審稿:王海斌編輯:啊琛琛
好看,就要點個"在看"
總結
以上是生活随笔為你收集整理的c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。