去哪儿网的一道面试题:找出字符串出现最多的字符

问题:

给定一个字符串,要求把字符串中出现次数最多的字符打印出来。

分析:

不置可否,肯定要统计每个字符出现的次数,然后根据字符出现次数的大小打印出出现次数最多的字符,另外需要注意的是出现次数最多的字符个数可能不止一个。

解决方案:

1 最容易想到的就是建立一个map,字符作为key,初始化次数cnt为0,每次遍历数组中的一个元素的时候,如果能在map中查到该字符,那么该map元素的cnt++,如果没有找到该元素,那么在map中插入该元素,并且cnt++。这样的话遍历完整个数组的时间复杂度是O(n*logn)。

 然后再遍历整个map找到元素最大的,总之这个方法效率不是很高

2 利用哈希表的思想 或者说是计数排序的思想,ASCII码中字符的个数不超过256,我们就创建一个大小为256的数组,然后遍历数组,直接将字符对应的ASCII码作为数组的索引,索引对应的计数次数+1.这样统计每个字符出现的次数的时间复杂度就是是O(n)了。

然后的就简单了,遍历计数数组,遇到跟当前出现次数一样大的就压栈,如果遇到更大的就把之前的出栈,再把当前最大的压栈,如此即可。


3 程序实现:

#include <iostream>
#include <vector>
using namespace std;

void findMaxChar(char* str);

void main()
{
	char* str = "I'm a good boy!!!";
	findMaxChar(str);
}



void findMaxChar(char* str)
{
	int strn[256] = {0};
	char *p = str;
	while(*p != '\0')
	{
		strn[*p]++;
		p++;
	}
	vector<char> vec;
	int nMax=-1;
	for(int i=0;i<256;i++)
	{
		if(strn[i]==nMax)
			vec.push_back(i);
		if(strn[i]>nMax)
		{
			while(!vec.empty())
				vec.pop_back();
			vec.push_back(i);
			nMax = strn[i];
		}
	}

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

}

4 感想

如果想找个好工作,事先做好准备真的很重要的,那些大的互联网公司一般不怎么考察你的语言,而是考察你的思维应变能力,知识面广度,某一面的深度。算法几乎是每个公司都要文的,有时候算法掌握的好坏可以说决定你是否能拿到offer。有空还是多看看经典的算法数据《算法导论》,《数据结构与算法分析》,另外针对公司面试的具体准备下,看看什么《面试宝典》,《面试金典》,《剑指offer》之类的,里面的面试题目都很经典,很多公司的面试题要么是出自其中,要么就是稍微改造一下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值