2024年百度暑期实习生笔试题 数据挖掘方向

发布 2024-01-12 02:25:13 阅读 2724

1. 单词a中任意字母交换位置变为单词b,我们就称单词a,b为兄弟单词,如 army 与 mary为兄弟单词。现给一个单词字典,用户输入一个单词,找出字典中所有的兄弟单词,请写出你的解题思路和算法。

答:我有两个思路。

思路一:是对输入的单词进行全排列,对每一种排列在字典里查询,统计查到的兄弟单词个数。(但是这个思路有个问题,就是单词的字母太多的时候,排列情况非常多,查询时间复杂度很大)

思路二:将字典里的所有单词按字母顺序重新组成单词,如army和mary都变成amry,那么所有兄弟单词都变成同样的单词。再对这些变化过后的单词做hash映射,再对输入的单词做同样的映射,就可以很快查询出所有兄弟单词,查询的时间复杂度为o(1)

2. 线程和进程有什么区别,“线程安全”怎么理解?

(这是考操作系统里的线程和进程的相关知识,很多书中都有答案)

3. c与c++分别是怎样动态分配和释放内存的,有什么区别?

(这个题也是概念题,从书中或者网上找答案吧)

4. 网页爬虫,即从一个网页开始,查找出该页的所有url**,并进入这些url,如此循环,直到某个时候连接回来或者到某个空白页为止。将这些连接url一一连接起来。

为了简单起见,假设每个网页里都只有一个url,从两个网页入口开始,做上述操作,那么将形成两个单向链表。请判断这两个爬虫里有没有相同的url。(大概是这样的)

答:其实这就是变相的问,两个单向链表有没有相交。我有两种思路。

思路一:如果两个单身链表相交,那么从相交节点开始,后面的节点完全重合,直到链表末尾(这个可以自己画一下,因为是单向链表)。所以用两个指针分别指向两个链表头节点,从头节点开始依次往后直到指向链表末尾,然后判断两个指针是不是指向同一个节点,如果是,那么就有相同的url。

思路二:将其中一个链表(l1)的末尾指向另一个链表(l2)的头节点,然后从l1的头节点开始往后遍历每个节点,并留下访问过的标记。如果有相交,那么肯定会形成一个环,所以如果检测到有环的话,说明有相同的url。

5. 数组al[0...num-1]可以分为两部分,al[0...

mid-1]和al[mid...num-1],并且这两部分都各自有序。请将数组两部分merge(合并),形成一个总体有序的数组,并且要求空间复杂度为o(1)。

答:这个题如果没有要求空间复杂度,那么很容易想到用归并排序,但是是要另外开辟一个同样大小的数组,所以不行。其实这个题要求空间复杂度为o(1),就是说不能另外开辟空间,我的方法是将al[mid...

num-1]的每个元素插入到al[0...mid-1]里,先在前部分,找到待插入元素的位置,然后将要插入的元素保存到一个变量里,然后从待插入的位置开始把后面的元素依次往后移动一格,腾出位置,最后将保存下来的元素插入到该位置,最终形成一个整体有序的数组。

6. 是一个关于搜索中的suggestion的东东,也就是你在搜索框里输入某个字,会有提示相关的语句的下拉列表。比如说输入“北京”,那么会提示“北京地铁”、“北京天安门”..

请问这是怎么实现的,写出相应的数据结构和思路,要求效率尽可能高,有没有新的方法提高效率。

(这个题我没怎么答出来,就是写了一下思路,用字典树记录用户搜索的词频,然后统计出词频最高的几条进行提示,不知道对不对)

1. 单词a中任意字母交换位置变为单词b,我们就称单词a,b为兄弟单词,如 army 与 mary为兄弟单词。现给一个单词字典,用户输入一个单词,找出字典中所有的兄弟单词,请写出你的解题思路和算法。

答案:思路一)计算ascii码,如果值与输入词的ascii码相等,再判断;

思路二)是对输入的单词进行全排列,对每一种排列在字典里查询,统计查到的兄弟单词个数。(但是这个思路有个问题,就是单词的字母太多的时候,排列情况非常多,查询时间复杂度很大)

思路三)将字典里的所有单词按字母顺序重新组成单词,如army和mary都变成amry,那么所有兄弟单词都变成同样的单词。再对这些变化过后的单词做hash映射,再对输入的单词做同样的映射,就可以很快查询出所有兄弟单词,查询的时间复杂度为o(1)

2.线程和进程有什么区别,“线程安全”怎么理解?

答案:线程是指进程内的一个执行单元,也是进程内可调度的实体。

与进程的区别:

1)地址空间:进程内的一个执行单元;

进程至少有一个线程;

它们共享进程的地址空间;

而进程有自己独立的地址空间;

2)线程是处理器调度的基本单位,但进程不是;

3)线程是处理器调度的基本单位,但进程不是;

4)二者均可并发执行。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

如果你的**所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段**。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

或者说:,也就是说我们不用考虑同步的问题。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

3. c与c++分别是怎样动态分配和释放内存的,有什么区别?

答案:c语言提供内存动态分配的函数有:malloc、calloc、realloc,在使用这些函数时必须包含其头文件,分别为:<>

1) malloc 函数: void *malloc(unsigned int size)

在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回null,申请的内存不会进行初始化。

2)calloc 函数: void *calloc(unsigned int num, unsigned int size)

按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。

calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。

3)realloc 函数: void *realloc(void *ptr, unsigned int size)

动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。

申请的内存空间不会进行初始化。

用c语言提供的这些动态内存分配函数后,对于这些已经申请的内存空间需要你自己进行释放。如果你没有释放,并且你只是随便运行一下自己的一个很小的程序,可能不会产生什么很大的影响。但是,如果这样一个大型程序或软件运行中调用了这些语句,而没有对申请的内存进行释放,那么后果是很严重的。

因此,在我们平时写程序的过程中,应该养成好的变成习惯。在使用了这些函数动态分配了一段内存后,要记得对其进行释放。

释放的函数为free函数:

free函数原型为:void free(void *ptr)

作用:释放由上面3种函数所申请的内存空间。

参数:ptr:指向需要释放的内存空间的首地址。

在c++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

申请和释放堆中分配的存储空间,分别使用new 和 delete 的两个运算符来完成:

指针变量名 = new 类型名(初始化式);

delete 指针名;

例如:int *pi = new int(0)

4、网页爬虫,即从一个网页开始,查找出该页的所有url**,并进入这些url,如此循环,直到某个时候连接回来或者到某个空白页为止。将这些连接url一一连接起来。为了简单起见,假设每个网页里都只有一个url,从两个网页入口开始,做上述操作,那么将形成两个单向链表。

请判断这两个爬虫里有没有相同的url。(大概是这样的)

答案:其实这就是变相的问,两个单向链表有没有相交。我有两种思路。

思路一:如果两个单身链表相交,那么从相交节点开始,后面的节点完全重合,直到链表末尾(这个可以自己画一下,因为是单向链表)。所以用两个指针分别指向两个链表头节点,从头节点开始依次往后直到指向链表末尾,然后判断两个指针是不是指向同一个节点,如果是,那么就有相同的url。

思路二:将其中一个链表(l1)的末尾指向另一个链表(l2)的头节点,然后从l1的头节点开始往后遍历每个节点,并留下访问过的标记。如果有相交,那么肯定会形成一个环,所以如果检测到有环的话,说明有相同的url。

具体思路见我的博文《寻找两个单链表的第一个公共节点》

5. 数组al[0...num-1]可以分为两部分,al[0...

mid-1]和al[mid...num-1],并且这两部分都各自有序。请将数组两部分merge(合并),形成一个总体有序的数组,并且要求空间复杂度为o(1)。

答案:这个题如果没有要求空间复杂度,那么很容易想到用归并排序,但是是要另外开辟一个同样大小的数组,所以不行。其实这个题要求空间复杂度为o(1),就是说不能另外开辟空间,我的方法是将al[mid...

num-1]的每个元素插入到al[0...mid-1]里,先在前部分,找到待插入元素的位置,然后将要插入的元素保存到一个变量里,然后从待插入的位置开始把后面的元素依次往后移动一格,腾出位置,最后将保存下来的元素插入到该位置,最终形成一个整体有序的数组。

2024年暑期实习生实习日记

面试。xx园林绿化 要招聘实习生是从一个校友那里得知的。简历投出后,15号接到了欧阳经理通知面试的 有点高兴,有点冷静。如约来到了位于佳兴大厦东座的xx园林公司,欧阳经理接待了我,在的会议室里进行面试。xx经理询问了我的基本情况,我一一地回答。然后欧阳经理对我的简历提出了几点意见,接着又问了我进入公...

深圳移动2019届暑期实习生招聘公告

深圳移动2013届毕业生招聘 即2012年 领先100 暑期实习生 公告。中国移动广东公司深圳分公司 简称 深圳移动 2013届毕业生招聘 即2012年 领先100 暑期实习生 已经开始,目前处于网投简历阶段。通过此次招聘面试的同学先是暑期 7 8月,据说时长1个月左右 在深圳移动公司进行实习,实习...

绿城集团2019“蒲公英计划”暑期实习生招募开始啦

绿城集团 2012 蒲公英计划 暑期实习生招募开始啦!各位亲爱的同学,想实现个人的创业梦想吗?想近距离了解一流房产企业吗?想接受高端销售的荣耀与挑战吗?绿城集团 蒲公英计划 为你圆梦!在这个暑假,我们挥洒青春的激情与汗水,享受销售的乐趣,迎接成功的挑战,收获完整的职业锻炼。表现优秀的实习生,可获得绿...