2016腾讯笔试

来源:互联网 发布:同服务器域名查询 编辑:程序博客网 时间:2024/06/06 01:08

网上笔试,当初自己报的岗位好像是移动事业群什么的,题目也多数跟移动开发相关,也是比较难的,还有很多细的东西,没注意就忘记了。在这里把这些题目记一下吧。

最后的四道大题:

第一题
假设在32位机器上,请在2亿个随机的、未经排序的32位整形数字中找出中间值。

算法导论的课并没有学,自己的算法基础什么的也算不上多好,本能的反应就想到快排了,自己想的方法就是:

类似快排的思想,取第一个数,将所有数据分为两拨
中位数肯定是在排好序中的第一亿个数
那么肯定在这两拨数里面数量多的那部分,数量少的那部分就可以不管了
然后再对数量多的那部分分,目的是要找到第一亿个数所在的位置,或者所在的区间

这样做的缺点很明显,就像快排那样不稳定,给你一个排好序的队列,就要数到死,还有就是扫描这整个数列太多遍了。
之前有一个算法是这样的:

1、扫描整个数列,如1、9、5、6、2
2、自定义一个数组,将其位置置为1,就得到[0 1 1 0 0 1 1 0 0 1]
3、这样再扫描一遍数组,有输出的第三个1的数字,就是中位数了

这个也是不行的,对于2亿个int32的数字,不可能没有重复的,一旦有重复的,这个算法就不是那么试用了,而且数组需要开的很大,内存够吗?这我也不是太懂。

扫描整个数列,将整个数列分为N个块,比如0-100、101-200…这样
找出第一亿个数所在的块,其位置在哪一块里面,再从里面找就行了

或许这是个最好的解决办法了。

第二题
如果输入的字符串只包含字母和#号。编写一个函数func,功能是除了中间和尾部的#号外,将字符串中的其它#号都删除。

中间的#号,不懂是字符串的中间,还是所有#号的中间,所以就当做是所有#号的中间值来处理了。感觉自己完全没有考虑效率问题,会不会太水,就是扫描一遍字符串,得到所有#号的长度,再扫描一遍,如果位置在中间和末尾的#号保留即可。

string func(string str){    vector<int> v;    string result = '';    for(int i=0; i<str.size(); i++){        if(str[i] == '#'){            v.push_back(i);        }    }    for(int i=0; i<str.size(); i++){        if(str[i]!='#' || i==(v.size()-1)/2 || i==v[v.size()-1]){            result += str[i];        }    }    return result;}

还有两题:

第三题
使用JNI写一段代码,实现jstring Java_com_demo_helloworld(JNIEnv *env, jclass cls, jstring j_str)函数,实现在字符串j_str(“world”)前面加上hello,并返回

第四题
现有大量英语文章,统计出里面每个单词出现的次数,考虑程序运行效率,给出思路(不区分大小写,假设只含有英文字母)

0 0