2023年6月29日发(作者:)
【百度笔试题及答案】百度题库及答案
百度java笔试题(含答案)
更多面试题,
百度面试笔试题 解答答案
专家回答:
第一题
简评
百度的主要业务是搜索,搜索的基本原理如下
1.编写爬虫程序到互联网上抓取网页海量的网页。
2.将抓取来的网页通过抽取,以一定的格式保存在能快速检索的文件系统中。
3.把用户输入的字符串进行拆分成关键字去文件系统中查询并返回结果。
由以上3点可见,字符串的分析,抽取在搜索引擎中的地位是何等重要。
因此,百度的笔试面试题中,出现这样的题就变得理所当然了。
以下是该题的java实现,代码如下:
程序代码 程序代码
import .*;
import .*;
import .*;
/** * @author tzy * 在j2sdk1.4.2下测试通过 */
public class FileNameStat{
private String srcPath;//要统计的文件路径
private Map statMap;//用于统计的map
public FileNameStat(String srcPath)
{ h=srcPath; 软件开发网
statMap=new TreeMap();
}
/*获得要统计的URL的文件名*/
public String getFileName(String urlString)
{
URL url=null;
String filePath=null;
String fileName=null;
try
{
url=new URL(urlString);
filePath=h();
int index=0;
if ((index=dexOf(“/“))!=-1)
{
fileName=ing(index+1);
else
{
fileName="";
}
}
catch(MalformedURLException e)
{
}
return fileName;
}
/*统计指定文件名的个数*/
public void stat(String filename) {
Integer count=null;
if((filename)!=null)
{
count=(Integer)(filename);
count=new Integer(ue()+1);
}
else
{
count=new Integer(1);
}
(filename,count);
}
/*统计的主方法*/
public void start() throws FileNotFoundException,IOException
{
BufferedReader
FileReader(h));
String temp=null;
while((temp=ne())!=null)
{
stat(getFileName(temp));
}
}
/*输出统计结果*/
public void result()
{
Iterator it=et().iterator();
while(t())
bfin=new BufferedReader(new {
entry=()(());
n((().equals("")?"":()) + "的个数是" + ue()); }
}
public static void main(String[] args) throws Exception
{
FileNameStat fns=new FileNameStat("");//指定成待统计文件
();
();
}
}
第二题
简评:
这道题也与百度的业务有关,百度现在除了搜索外,还有贴吧,知道,博客等重要产品。 同时也在积极的探索社区化,包括前不久宣布进军电子商务领域,搜索之外的这些产品,其主要功能的实现主要是对数据库的操作。 因此,想进入百度,也需要对数据库有一定的认识。 实现思路及数据库设计: 1,该论坛主要有两个实体对象,用户和帖子;对于帖子对象,有一个问题:回复的帖子是否应该跟主题帖子存放在同一个表里?
考虑到每天更新10万帖子,说明帖子数比较多,为了方便主题的呈现,我一般都把主题贴和回帖分别放在不同的表中,把主题贴和回帖分开可以提高查询效率(300万的访问量每天)。
2,按照1中的思路,该论坛由两个对象(用户和帖子)变成三个实体对象,分别是用户,主题帖子,回复帖子;
3,上述三个对象存在三个关系,分别是:
用户--主题帖,一个用户可以发0个或多个帖子,一个帖子对应空文件名一个用户(一对多关系),
主题帖--回复帖:一个主题有0个或多个回复帖子,一个回复帖子对应一个主题(一对多关系);
用户--回复贴:一个用户可以回0个或多个帖,一个帖子对应一个用户(一对多关系)。
还存在对回复贴的回复,这个考虑用fatherId来表示。
4,由于三个关系 “用户--主题帖,主题帖--回复帖,用户--回复贴” 都是一对多关系,根据表设计一般原则,可以将这两个关系独立建立表,也可以不另外建表而将一对多的关系体现在实体表中;然而,表间的连接查询是非常耗资源的,所以应尽量减少表间连接,那么对三个关系不应该分别建表,而是把用户的id作为主题表和回帖表的外键,把主题贴id作为回帖表的外键。
5,鉴于以上考虑,该论坛的三个表如下所示
表名:t_user_info (用户信息表)
字段名 类型 缺省值 中文含义 约束 备注
id Int 用户编号 PRI Auto_increment
Name Varchar(30) 用户名
Email Varchar(50)
Phone Varchar(30)
Addr Varchar(200)
其他字段略,根据需要添加 表名:main_content_info (主题帖信息表)
字段名 类型 缺省值 中文含义 约束 备注
id Int 贴编号 PRI Auto_increment
Title Varchar(200) 发帖标题
Content Text 发帖内容
UserID Int 用户编号 外键
其他字段略,根据需要添加
表名:sub_content_info (回复贴信息表) 字段名 类型 缺省值 中文含义 约束 备注
id Int 贴编号 PRI Auto_increment
Title Varchar(200) 发帖标题
Content Text 发帖内容
UserID Int 用户编号 外键
FatherID Int 父编号
MainID Int 主题帖编号 外键
其他字段略,根据需要添加
6,符合范式分析:
上述表中每个字段不可再分,首先满足1NF;
然后数据库表中的每个实例或行都是可以被惟一地区分(id),不存在部分依赖,因此满足2NF;
t_user_info (用户信息表)和main_content_info (主题帖信息表)不存在任何传递依赖,至少属于BCNF;
但是sub_content_info (回复贴信息表)不满足3NF,因为存在如下传递依赖:id--FatherID,FatherID--MainID。
范式并不是越高越好,sub_content_info表只满足2NF却更有效率,也是当今论坛较主流的设计。
第三题
简评:
如何对海量数据进行快速检索,这是搜索引擎的必需考虑的问题。这又涉及到数据结构和算法。 因此,要想进入百度,就必须熟悉一些基本的算法和数据结构。 思路及解决方案如下:
1: 设计用TRIE树实现关键词到其对应id的快速词典查找
TRIE树的每一个节点为一个包含256个元素的数组,同时指针指向其下一级节点
节点定义如下:
struct trienode
{ int id;
struct trienode *child;
}*****E;
如果TRIE树的某个节点的指针为NULL,说明从跟节点到当前节点的路径构成文件B中的一个关键词,
在其节点的id保存该关键词的id;如果指针不为NULL,则id对应为0或者一个无穷大的整数,标志从根节点
到当前节点的路径不是一个完整的关键词。
将关键词转化为二进制无符号char型数组,即对于汉字等双字节字符视为两个无符号char型整数,
每个元素的取值范围在0到255之间。
2:生成文件b的TRIE树
步骤1:依次读取文件b的每一行,对每一行执行步骤2到步骤5
步骤2:读取关键词id和关键词,令为key
步骤3:依次读取key的每一个字符,对每一个字符,执行步骤4;
步骤4:如果该字符对应的指针为NULL,则创建其儿子节点;
步骤5:为当前节点的对应字符id置为关键词id
3:根据A文件生成C文件
步骤1:依次读取文件A的每一行,对每一行执行步骤2到步骤5
步骤2:分别获取当前行关键词、ip地址和时间
步骤3:令关键词,对c1到cm每个字符,执行步骤4
步骤4:获取根节点的第c1个元素指针,转移到节点node1,
根据node1的第c2个元素指针,转移到
根据nodem的第cm个元素,获取关键词的id
步骤5:往文件c中写入一行数据,格式为关键词的id、ip地址和时间
生成文件B的TRIE树过程时间复杂度为O(n*m),其中n为文件b行数,m为文件b关键词的最大长度。TRIE的空间复杂度为O(n*m),n和m含义同上,但由于实际应用中关键词之间可能会有很多前缀相同现象,所以实际耗费空间并不会很高。
生成C文件的时间复杂度同样为O(n*m),n为文件a行数,m为文件a关键词的最大长度,因为有了TRIE树之后,给定一个关键词获得其id的时间复杂度为关键词长度。生成C文件的过程除了TRIE树空间外基本不需要太多额外的空间,空间复杂度为O(1),由于系统有1G的可用内存,TRIE占用的空间在几十兆到200M之间(与关键词集合有关),因此本方法完全可行。
更多面试题,
百度网上笔试题及答案
编程: 1 编程: 用 C 语言实现一个 revert 函数,它的功能是将输入的字符串在原串上倒序 后返回。 编程: 2 编程: 用 C 语言实现函数 void * memmove(void *dest,const void *src,size_t n)。memmove 函数的功能是拷贝 src 所指的内存内容前 n 个字节到
dest 所指的 地址上。 英文拼写纠错: 3 英文拼写纠错: 在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已 经有一个包含了正确英文单词的词典,请你设计一个拼写纠错的程序。
(1)请描述你解决这个问题的思路; (2)请给出主要的处理流程,算法,以及算法的复杂度; (3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问 题)。 寻找热门查询: 4 寻找热门查询 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来, 每个查询串的长度为 1-255 字节。假设目前有一千万个记录,这些查询串的重 复度比较高,虽然总数是 1 千万,但如果除去重复后,不超过 3 百万个。一个 查询串的重复度越高,说明查询它的用户越多,也就是越热门。请你统计最热 门的 10 个查询串,要求使用的内存不能超过 1G。 (1)请描述你解决这个问题的思路; (2)请给出主要的处理流程,算法,以及算法的复杂度。 集合合并:
5 集合合并 给定一个字符串的集合,格式如: {aaa bbb ccc}, {bbb
ddd},{eee fff},{ggg},{ddd hhh} 要求将其中交集不为空的集合合并,要求合并完成后 的集合之间无交集,例如上例应输出 {aaa bbb
ccc ddd hhh},{eee fff}, {ggg} (1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度 (3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问 题)。
//////////////////////////////// 1 题 char *revert(char * str) { int
n=strlen(str); int i=0; char c; for(i=0;i { c=str; str=str[n-i]; str[n-i]=c; }
return str; } /////////////////////////////////// 2 题 void *
memmove(void *dest,const void *src,size_t n)
{ assert((dest!=0)(src!=0)); char * temp=(char * )dest; char * ss=(char
* )src; int i=0; for(;i { *temp =*ss ; } return temp; }
///////////////////////////////////////////////// 3 题 (1)思路: 字典以字母键树组织,在用户输入同时匹配 (2) 流程: 每输入一个字母: 沿字典树向下一层, a)若可以顺利下行,则继续至结束,给出结果; b)若该处不能匹配,纠错处理,给出拼写建议,继续至 a);
算法: 1.在字典中查找单词 1.在字典中查找单词 字典采用 27
叉树组织,每个节点对应一个字母,查找就是一个字母 一个字母匹配.算法时间就是单词的长度
k. 2.纠错算法 2.纠错算法 情况:当输入的最后一个字母不能匹配时就提示出错,简化出错处理,动态提示 可能 处理方法: (a)当前字母前缺少了一个字母:搜索树上两层到当前的匹配作为建议; (b)当前字母拼写错误:当前字母的键盘相邻作为提示;(只是简单的描述,可 以有更多的) 根据分析字典特征和用户单词已输入部分选择(a),(b)处理 复杂性分析:影响算法的效率主要是字典的实现与纠错处理 (a)字典的实现已有成熟的算法,改进不大,也不会成为瓶颈; (b)纠错策略要简单有效 ,如前述情况,是线性复杂度; (3)改进 (3)改进
策略选择最是重要,可以采用统计学习的方法改进。 ////////////////////////////////////////////// 4 题 (1)思路 (1)思路:用哈希做 思路 (2) 首先逐次读入查询串,算哈希值,保存在内存数组中,同时统计频度(注 意值与日志项对应关系) 选出前十的频度,取出对应的日 志串,简单不过了。哈希的设计是关键。 ////////////////////////////////////////////////// 5 题 (1)思路:先将集合按照大小排列后,优先考虑小的集合是否与大的集合有交
思路 集。有就合并,如果小集合与所有其他集合都没有交集,则独立。独立的集合 在下一轮的比较中不用考虑。这样就可以尽量减少字符串的比较次数。当所有 集合都独立的时候,就终止。
(2)处理流程: 处理流程: 1.将集合按照大小排序,组成集合合并待处理列表 2.选择最小的集合,找出与之有交集的集合,如果有,合并之;如果无,则与 其它集合是独立集合,从待处理列表 中删除。
3.重复直到待处理列表为空 算法: 算法: 1。将集合按照大小从小到大排序,组成待处理的集合列表。 2。取出待 处理集合列表中最小的集合,对于集合的每个元素,依次在其他集合中搜索是 否有此元素存在: 1若存在,则将此小集合与大集合合并,并根据大小插入对应的位置 。转 3。 2若不存在,则在该集合中取下一个元素。如果无下一个元素,即所有元素都 不存在于其他集合。则表明此集合独立,从待处理集合列表中删除。并加入结 果集合列表。转 3。 3。如果待处理集合列表不为空,转 2。 如果待处理集合列表为空,成功退出,则结果集合列表就是最终的输出。 算法复杂度分析: 算法复杂度分析: 假设集合的个数为 n,最大的集合元素为 m 排序的时间复杂度可以达到 n*log(n) 然后对于元素在其他集合中查找,最坏情况下为(n-1)*m 查找一个 集合是否与其他集合有交集的最坏情况是 m*m*(n-1) 合并的时间复杂度不会超 过查找集合有交集的最坏情况。所以最终最坏时间复杂度为 O(m*m*n*n) 需要说明
的是:此算法的平均时间复杂度会很低,因为无论是查找还是合
需要说明的是 并,都是处于最坏情况的概率很小,而且排序后优先用最小集合作为判断是否 独立的对象,优先与最大的集合进行比较,这些都最大的回避了最坏情况。 (3)可能的改进: (3)可能的改进: 可能的改进 首先可以实现将每个集合里面的字符串按照字典序进行排列,这样就可以 将查找以及合并的效率增高。另外,可能采取恰当的数据结构也可以将查找以 及合并等操作的效率得到提高。
百度11月4日网上笔试题及答案(仅供参考)
百度11月4日网上笔试题及答案(仅供参考)
编程:
1用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
2 编程:
用C语言实现函数void * memmove(void *dest,const void
*src,size_t
n)。memmove
函数的功能是拷贝src所指的内存内容前n个字节
到dest所指的地址上。
3 英文拼写纠错:
在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包
含了正确英文单词的词典,请你设计一个拼写纠错
的程序。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度;
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
4 寻找热门查询:
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串
的长度为1-255字节。假设目前有一千万个记录,
这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个
。一个查询串的重复度越高,说明查询它的用户越多,
也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度。
5 集合合并:
给定一个字符串的集合,格式如:
{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应
输出
{aaa bbb ccc ddd hhh},{eee fff}, {ggg}
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
////////////////////////////////1
1 题
char *revert(char * str)
{
int n=strlen(str);
int i=0;
char c;
for(i=0;i {
c=str;
str=str[n-i];
str[n-i]=c;
} return str;
}
///////////////////////////////////
2 题
void * memmove(void *dest,const void *src,size_t n)
{
assert((dest!=0)(src!=0));
char * temp=(char * )dest;
char * ss=(char * )src;
int i=0;
for(;i {
*temp++=*ss++;
}
return temp;
}
/////////////////////////////////////////////////
3 题
(1)思路 :
字典以字母键树组织,在用户输入同时匹配
(2)
流程:
每输入一个字母:
沿字典树向下一层,
a)若可以顺利下行,则继续至结束,给出结果;
b)若该处不能匹配,纠错处理,给出拼写建议,继续至a);
算法:
1.在字典中查找单词
字典采用27叉树组织,每个节点对应一个字母,查找就是一个字母 一个字母匹配.算法时间就是单词的长度k.
2.纠错算法
情况:当输入的最后一个字母不能匹配时就提示出错,简化出错处理,动态提示
可能 处理方法:
(a)当前字母前缺少了一个字母:搜索树上两层到当前的匹配作为建议;
(b)当前字母拼写错误:当前字母的键盘相邻作为提示;(只是简单的描述,可
以有更多的)
根据分析字典特征和用户单词已输入部分选择(a),(b)处理
复杂性分析:影响算法的效率主要是字典的实现与纠错处理
(a)字典的实现已有成熟的算法,改进不大,也不会成为瓶颈;
(b)纠错策略要简单有效 ,如前述情况,是线性复杂度;
(3)改进
策略选择最是重要,可以采用
统计学习的方法改进。
//////////////////////////////////////////////
4 题
(1)思路:
用哈希做
(2)
首先逐次读入查询串,算哈希值,保存在内存数组中,同时统计频度
(注意值与日志项对应关系)
选出前十的频度,取出对应的日志串,简单不过了。
哈希的设计是关键。
//////////////////////////////////////////////////
5 题 (1)思路:先将集合按照大小排列后,优先考虑小的集合是否与大的集合有交集。有
就合并,如果小集合与所有其他集合都没有交集,则独立。独立的集合在下一轮的比
较中不用考虑。这样就可以尽量减少字符串的比较次数。当所有集合都独立的时候,
就终止。
(2)处理流程:
1.将集合按照大小排序,组成集合合并待处理列表
2.选择最小的集合,找出与之有交集的集合,
如果有,合并之;
如果无,则与其它集合是独立集合,从待处理列表 中删除。
3.重复直到待处理列表为空
算法:
1。将集合按照大小从小到大排序,组成待处理的集合列表。
2。取出待处理集合列表中最小的集合,对于集合的每个元素,依次在其他集合中搜索
是否有此元素存在:
1若存在,则将此小集合与大集合合并,并根据大小插入对应的位置 。转3
。
2若不存在,则在该集合中取下一个元素。如果无下一个元素,即所有元素
都不存在于其他集合。则表明此集合独立,从待处理集合列表中删除。并加入结果集
合列表。转3。
3。如果待处理集合列表不为空,转2。
如果待处理集合列表为空,成功退出,则结果集合列表就是最终的输出。 算法复杂度分析:
假设集合的个数为n,最大的集合元素为m
排序的时间复杂度可以达到n*log(n)
然后对于元素在其他集合中查找,最坏情况下为(n-1)*m
查找一个集合是否与其他集合有交集的最坏情况是m*m*(n-1)
合并的时间复杂度不会超过查找集合有交集的最坏情况。
所以最终最坏时间复杂度为O(m*m*n*n)
需要说明的是:此算法的平均时间复杂度会很低
,因为无论是查找还是合并,都是处
于最坏情况的概率很小,而且排序后优先用最小集合作为判断是否独立的对象,优先
与最大的集合进行比较,这些都最大的回避了最坏情况。
(3)可能的改进:
首先可以实现将每个集合里面的字符串按照字典序进行排列,这样就可以将查找以及
合并的效率增高。
另外,可能采取恰当的数据结构也可以将查找以及合并等操作的效率得到提高。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687987010a64111.html
评论列表(0条)