发布于 2014-10-20 07:40:04 | 216 次阅读 | 评论: 0 | 来源: 网友投递
百度(Baidu)中文搜索引擎
百度(Nasdaq简称:BIDU)是全球最大的中文搜索引擎,2000年1月由李彦宏、徐勇两人创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。
题一
a+b交换(1)不浪费存储空间(2)会产生什么异常(3)如果产生异常该怎么解决(4)有多少种交换方式
普通的解法会造成内存的溢出
下面提供三种解法
下面有三种解法用c++编写,我试用了java可是java不会溢出,大概和编译器或者jvm有关
1.利用异或实现
2.利用指针,地址指向改变
3.利用栈实现,结果如下
int main()
{
int a=4294967295;
int b=2100000000;
a=a^b;
b=a^b;
a=a^b;
/*int *a,*b; //假设
a=new int(2147483647);
b=new int(2147483647); //&a=0x00001000h,&b=0x00001200h
if(a<b)
{
a=(int*)(b-a);
b=(int*)(b-(int(a)&0x0000ffff));
a=(int*)(b+(int(a)&0x0000ffff));
}
else
{
b=(int*)(a-b);
a=(int*)(a-(int(b)&0x0000ffff));
b=(int*)(a+(int(b)&0x0000ffff));
}*/
/*
stack<int> s;
int a=10;
int b=20;
s.push(a);
s.push(b);
a=s.top();
s.pop();
b=s.top();
cout<<a<<" "<<b;
return 0;
}*/
题二
将一个10进制转为2进制,计算1出现的个数 代码实现
三种方法
第一种就不写了
第二种
int num=0;
int v=255;
while(v!=0)
{
num=num+(v&ox01);
v>>=1;
复杂度为O(logV)
}
//位操作
第三种解法
while(v!=0)
{
v=v&(v-1);
num++;
//复杂度降低到O(M)
}
第四种空间换时间
把你所要的数所有情况1的个数全部列出来,该数的下标就是1的个数,典型的空间置换时间,如果频繁使用时,这是一个不错的方法
题三
从数组里找出 A和B,其和等于面试管给出的数 即 A+B=C,所用的时间复杂度最小 代码实现
3种解法解题思路层层递进
1.两层for循环,然后比较, 时间复杂度为O(n^2);
2.先快速排序,然后再比较 时间复杂度为O(nlgn+n);
3.把数组放在hashSet中,然后利用面试管给的值减去hashSet中的数,然后放入HashSet,如果放的进去则该数不是,依次遍历,如果放不进去则有
否则遍历完输出没有AB该数
题四
25匹马一个赛场,每次只能赛5匹马,求出所用的比赛场数最少几场找出前5匹马
1.先找出前3匹快马
每5匹一队,需比赛5场,得出5匹马,得出每队的第一名(每队的第一名不一定是另一对的第一名)
让每队的第一名比赛一场,排出名次1,2,3,4,5(红色标注每一组的第一名比较后的结果)
则第一名是所有马中的第一名,第二名不一定是(获得第一名马的那匹马所在队的第一名),所以需要和获得第一名的那匹马所在的组的第二名进行比较,得出第二名(前提是每次五匹马,所以和3,4,5组成一队进行比赛),排好名次于是2,3名出来了,7场得出前3名,依次类推得到第五名
题五
两个表 进行内联,求其结果
表中某个字段相同的记录列出来就好
题六 linux知识
常用指令