找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3281|回复: 0

找出字符串出现次数最多的字符

[复制链接]
发表于 2015-1-29 06:05:13 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
这是去哪儿网的面试题。
问题:
给定一个字符串,要求把字符串中出现次数最多的字符打印出来。
分析:
不置可否,肯定要统计每个字符出现的次数,然后根据字符出现次数的大小打印出出现次数最多的字符,另外需要注意的是出现次数最多的字符个数可能不止一个。
解决方案:
1 最容易想到的就是建立一个map,字符作为key,初始化次数cnt为0,每次遍历数组中的一个元素的时候,如果能在map中查到该字符,那么该map元素的cnt++,如果没有找到该元素,那么在map中插入该元素,并且cnt++。这样的话遍历完整个数组的时间复杂度是O(n*logn)。
然后再遍历整个map找到元素最大的,总之这个方法效率不是很高
2 利用哈希表的思想 或者说是计数排序的思想,ASCII码中字符的个数不超过256,我们就创建一个大小为256的数组,然后遍历数组,直接将字符对应的ASCII码作为数组的索引,索引对应的计数次数+1.这样统计每个字符出现的次数的时间复杂度就是是O(n)了。
然后的就简单了,遍历计数数组,遇到跟当前出现次数一样大的就压栈,如果遇到更大的就把之前的出栈,再把当前最大的压栈,如此即可。

3 程序实现:
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. void findMaxChar(char* str);

  5. void main()
  6. {
  7.         char* str = "I'm a good boy!!!";
  8.         findMaxChar(str);
  9. }



  10. void findMaxChar(char* str)
  11. {
  12.         int strn[256] = {0};
  13.         char *p = str;
  14.         while(*p != '\0')
  15.         {
  16.                 strn[*p]++;
  17.                 p++;
  18.         }
  19.         vector<char> vec;
  20.         int nMax=-1;
  21.         for(int i=0;i<256;i++)
  22.         {
  23.                 if(strn[i]==nMax)
  24.                         vec.push_back(i);
  25.                 if(strn[i]>nMax)
  26.                 {
  27.                         while(!vec.empty())
  28.                                 vec.pop_back();
  29.                         vec.push_back(i);
  30.                         nMax = strn[i];
  31.                 }
  32.         }

  33.         vector<char>::iterator iter;
  34.         for(iter=vec.begin();iter<vec.end();iter++)
  35.                 cout<<*iter<<endl;

  36. }
复制代码
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 16:46 , Processed in 0.035149 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表