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


    问题:

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

    分析:

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

    解决方式:

    1 最easy想到的就是建立一个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 != '')
    	{
    		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》之类的。里面的面试题目都非常经典,非常多公司的面试题要么是出自当中,要么就是略微改造一下。

  • 相关阅读:
    MADDPG官方代码实现
    安装moviepy
    单目摄像机测距
    Tensorboard那些事
    instanceof、isPrototype、Object.create的区别
    鼠标事件以及clientX、offsetX、screenX、pageX、x的区别
    JS中的位置和宽度:clientWidth、offsetWidth、scrollWidth等区别
    vue项目build报错的解决办法(ERROR in static/js/vendor.xxxxx.js from UglifyJs)
    onclick(fn)与addEventListener("click", fn)的区别
    第五篇
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7253728.html
Copyright © 2020-2023  润新知