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的东东,也就是你在搜索框里输入某个字,会有提示相关的语句的下拉列表。比如说输入“北京”,那么会提示“北京交通大学”、“北京地铁”、“北京天安门”... 。请问这是怎么实现的,写出相应的数据结构和思路,要求效率尽可能高,有没有新的方法提高效率。
(这个题我没怎么答出来,就是写了一下思路,用字典树记录用户搜索的词频,然后统计出词频最高的几条进行提示,不知道对不对)
答:我有两个思路
2. 线程和进程有什么区别,“线程安全”怎么理解?
3. c与c++分别是怎样动态分配和释放内存的,有什么区别?
4. 网页爬虫,即从一个网页开始,查找出该页的所有url网址,并进入这些url,如此循环,直到某个时候连接回来或者到某个空白页为止。将这些连接url一一连接起来。为了简单起见,假设每个网页里都只有一个url,从两个网页入口开始,做上述操作,那么将形成两个单向链表。请判断这两个爬虫里有没有相同的url。(大概是这样的)
5. 数组al[0...num-1]可以分为两部分,al[0...mid-1]和al[mid...num-1],并且这两部分都各自有序。请将数组两部分merge(合并),形成一个总体有序的数组,并且要求空间复杂度为O(1)。
6. 是一个关于百度搜索中的suggestion的东东,也就是你在搜索框里输入某个字,会有提示相关的语句的下拉列表。比如说输入“北京”,那么会提示“北京交通大学”、“北京地铁”、“北京天安门”... 。请问这是怎么实现的,写出相应的数据结构和思路,要求效率尽可能高,有没有新的方法提高效率。