• 【面试题总结】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 }
  • 相关阅读:
    进程和线程的简单实例
    OpenGL3D演示程序
    c++中dll和lib
    OS锁机制,各种critical section、mutex、实现基础
    dll导出def出错
    负载均衡策略:
    lua读写文件
    C++ Singleton
    Lua模式匹配
    linux 下查找不符合条件的文件并cp
  • 原文地址:https://www.cnblogs.com/xuelisheng/p/10976949.html
Copyright © 2020-2023  润新知