【面試題總結】1、統計字符串中某個單詞出現的次數(1-C++實現)


【解決方法一】C++ map解決

一、map中的find函數:

用於查找map中是否包含某個關鍵字條目,傳入的參數是要查找的key,最后返回一個迭代器,如果沒有找到,則返回的迭代器等於end()返回的迭代器。示例代碼:

 1 #include<iostream>
 2 #include<string>
 3 #include<map>
 4 using namespace std;
 5 
 6 int main() {
 7     map<int, string> mapStudent;
 8 
 9     mapStudent.insert(pair<int, string>(1, "student_one"));
10     mapStudent.insert(pair<int, string>(2, "student_two"));
11     mapStudent.insert(pair<int, string>(3, "student_three"));
12 
13     map<int, string>::iterator iter;
14     iter = mapStudent.find(3);
15     if (iter != mapStudent.end())            
16         cout << "Find,the value is: " << iter->second << endl;
17     system("pause");
18     return 0;
19 }

運行結果:

二、map的插入方法:

插入的方法有好幾種,下面介紹:map.insert(pair<type1,type2>(key,value))這種,還有一種是map[key] = value,前者出現重復不會發生改變,后者出現重復則會發生覆蓋,后者如果沒有給value值,直接使用map[key],則其value值默認為0。示例代碼:

 1 #include<iostream>
 2 #include<string>
 3 #include<map>
 4 using namespace std;
 5 
 6 int main() {
 7 
 8     map<int, string> mapStudent;
 9     mapStudent.insert(pair<int, string>(1, "student_one"));
10     mapStudent.insert(pair<int, string>(2, "student_two"));
11     mapStudent.insert(pair<int, string>(2, "xxooxxooxxo"));//不起作用
12 
13     map<int, string>::iterator iter;
14     for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) {
15         cout << iter->first << ' ' << iter->second << endl;
16     }
17     cout << endl;
18     mapStudent[2] = "xxooxxooxxoo";//覆蓋掉前面的value
19     for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) {
20         cout << iter->first << ' ' << iter->second << endl;
21     }
22     system("pause");
23     return 0;
24 }

運行結果:

三、是否插入成功?

我們通過pair來獲取是否插入成功,pair返回兩個變量,第一個是map的迭代器,第二個是插入成功的標志,插入成功pair的第二個參數是true,插入失敗,第二個參數為false。實例代碼:

1 pair<map<type1,type2>::iterator,bool> ret;
2  
3 ret = map_s.insert(pair<type1,type2>(key,value))
4  
5 if(ret.second==ture)
6  
7     cout<<"插入成功"<<endl;
8 else
9     cout<<"插入失敗"<<endl;

四、統計字符出現個數:

思路1:先創建一個map,遍歷字符串,逐個判斷如果存在則count++,不存在則創建一個,讓其value為1

思路2:通過插入失敗來增加字符的個數,如果插入失敗則表明map中存在該字符,count++即可

思路3:需要對map了解,直接使用庫里提供的[]運算符重載。通過鍵值找節點,直接給給實值+1.

思路1:先創建一個map,遍歷字符串,逐個判斷如果存在則count++,不存在則創建一個,讓其value為1。代碼如下:

 1 #include<iostream>
 2 #include<string>
 3 #include<map>
 4 using namespace std;
 5 
 6 // 方法1:
 7 int main() 
 8 {
 9     map<char, int> map_s;
10     string str = "kkk ahguird-j l";
11 
12     for (int i = 0; i < str.length(); ++i) 
13     {
14         map<char, int>::iterator iter = map_s.find(str[i]);
15         if (iter != map_s.end()) 
16         {                                                
17             iter->second++;
18         }
19         else                                                                            // 如果找不到就添加一個,找到了就count++
20         {                                                                        
21             map_s.insert(pair<char, int>(str[i], 1));                // 如果測試用例為 "qwerqwer"時,前4次循環都是執行的這句else即insert插入操作
22         }
23     }
24     map<char, int>::iterator iter = map_s.begin();
25 
26     for (; iter != map_s.end(); iter++) 
27     {
28         cout << iter->first << ' ' << iter->second << endl;
29     }
30     cout << endl;
31     
32     system("pause");
33     return 0;
34 }

運行結果:

思路2:通過插入失敗來增加字符的個數,如果插入失敗則表明map中存在該字符,count++即可。代碼如下:

 1 #include<iostream>
 2 #include<string>
 3 #include<map>
 4 using namespace std;
 5 
 6 int main() 
 7 {
 8     map<char, int> map_s;
 9     string str = "kkk ahguird-j l";
10 
11     pair<map<char, int>::iterator, bool> ret;
12     for (int i = 0; i < str.length(); ++i)
13     {
14         ret = map_s.insert(pair<char, int>(str[i], 1));
15         if (ret.second == false)                                     // 如果插入失敗,則該迭代器的第一個參數的value++
16         {                                                                
17             ret.first->second++;
18         }
19     }
20     map<char, int>::iterator iter = map_s.begin();
21     for (; iter != map_s.end(); iter++)
22     {
23         cout << iter->first << ' ' << iter->second << endl;
24     }
25     cout << endl;
26 
27     system("pause");
28     return 0;
29 }

運行結果:

思路3:直接使用庫里提供的[]運算符重載。通過鍵值找節點,直接給給實值+1.

 1 #include<iostream>
 2 #include<string>
 3 #include<map>
 4 using namespace std;
 5  
 6 int main() {
 7     string str;
 8     map<char, int> map_s;
 9     while (cin >> str) {
10         for (int i = 0; i < str.length(); ++i) {
11             map_s[str[i]]++;
12         }
13         map<char, int>::iterator iter;
14         for (iter = map_s.begin(); iter != map_s.end(); ++iter) {
15             cout << iter->first << ':' << iter->second << endl;
16         }
17     }
18 }

思路3是真的6阿~

參考連接:https://blog.csdn.net/qq_34312386/article/details/55281662

對思路3補充說明:假設一個map對象map_s中只存在一對pair<char,int>('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++.

 1 #include<iostream>
 2 #include<map>
 3 using namespace std;
 4  
 5 int main() {
 6     map<char, int> m;
 7     m.insert(pair<char, int>('a', 1));
 8     map<char, int>::iterator iter = m.begin();
 9     cout << iter->first << ' '<<iter->second<<endl;
10     m['b'];
11     iter++;
12     cout << iter->first << ' ' << iter->second << endl;//value默認是0
13     m['b']++;
14     cout << iter->first << ' ' << iter->second << endl;//將value++
15     while (1);
16 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM