您的位置:首页 > 职场人生

微软100题(81)百度面试题_大数据处理

2015-06-15 11:25 453 查看
第1组百度面试题
1.一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],
其左边的数都小于等于它,右边的数都大于等于它。
能否只用一个额外数组和少量其它空间实现。
2.一个文件,内含一千万行字符串,每个字符串在1K以内,
要求找出所有相反的串对,如abc和cba。
3.STL的set用什么实现的?为什么不用hash?

1解答:
如果一个元素师左边最大的,又是右边最小的,那么就是要找的元素,所以一开始求出所有的右边最小数组rightmin,然后从左往右
void ThePivotElements(int data[],int len)
{
	int* rightmin = new int[len];
	int r_min = data[len-1];
	for (int i = len-1;i>=0;i--)
	{
		if(data[i]<r_min)
			r_min = data[i];
		rightmin[i] = r_min; 
	}
	int l_max = data[0];
	for (int i= 0;i<len;i++)
	{
		if(data[i]>l_max)
			l_max = data[i];
		if(l_max == rightmin[i])
			cout<<data[i]<<endl;
	}
}


2.文件大概10GB,必须要分成小文件处理,如何分,可以用hash(比如把每个字符串中字符的ascii相加,对100取模),分成100个小文件,要保证正串和反串都在一个文件里。
然后对每个文件中的串建立一个hash_set,如果hash_set里面有该串的hash了,则有可能是反串,进一步比较是不是反串,每个小文件都可以放到内存中去处理
或者 建立两个文件,一个文件是hash_set(比如对前K位处理),另一个是每个串反串(也对前K位处理)。如果第二个文件里面串的hash存在于第一个文件的hash_set里面,则有可能是反串,进一步比较

3、是用红黑树实现的,红黑树是一种平衡性很好的二分查找树。要使用hash的话,就需要为不同的存储类型编写哈希函数,这样就照顾不到容器的模板性了,而是用红黑树只需要为不同类型重载operator<就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: