第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<就可以了