百度软件开发和测试面试

百度软研一面:
2、手写算法直到数组最后一个节点的路径和
3、什么是管道、什么是信号量
进程IPC():
(1)管道(pipe):管道可用于具有亲缘关系的进程间的通信,是一种半双工的方式,数据只能单向流动,允许一个进程和另一个与它有共同祖先的进程之间进行通信,管道只能承载无格式字节流。
(2)fifo:命名管道克服了管道没有名字的限制,同时除了具有管道的功能外(也是半双工),它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
(3)信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事件发生了,除了进程间通信外,进程还可以发送信号给进程本身
(4)消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 
(5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
(6)内存映射:内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。 
(7)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
(8)套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。 
4、哈希表
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key
对应一个存储位置f(key),查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查
找集合中存在这个记录,则必定在f(key)的位置上。f为哈希函数。
负载因子最好 < 1/2,否则会发现经常出现冲突。
常用的哈希函数:
1)直接定地址法:f(key)=a*key+b;简单。均匀,不会产生冲突,适合表较小且连续的情况
2)数字分析法:通常适合处理关键字位数较大的情况(手机号码:后4位代表用户)
3)平方取中法:平方数的中间几位,适合不知道关键字的分布,位数又不是很大的情况
4)折叠法:将关键字从左到右分割成位数相等的几部分,将这几部分叠加求和,按散列表
表长,取后几位作为散列地址。
5)除留余数法:f(key) = key mod p (p<= m),不仅可以对关键字直接取模,也可在折叠、
平方取中后再取模。
6)随机数法:f(key)=random(key).随机函数,关键字长度不等时,采用这个方法构造散
列函数。
队列——是一种先进先出的线性表,允许插入的一端称为队尾,允许删除的一端是队头。
百度开测一面:
1、单链表有环:
public boolean hasC(ListNode head){
if(head == null || head.next == null)
return false;
ListNode p1 = head;
ListNode p2 = head;
while(p2!=null && p2.next!=null){
p1 = p1.next;
p2 = p2.next.next;
if(p1 == p2);
return true;
}
return false;
}
2、输入的字符串中含有给定的字符串的个数
public int getCount(String str,String a){
int count = 0;
int len = a.length();
int index = 0;
for(int i = 0; i < str.length(); i= len+index){
if((index = str.indexof(a,i))>-1)
count++;
else
break;
}
return count;
}
String[] ss = str.spilt(a);
return ss.length-1;
3、进程间的通讯方式(3种)
1)管道:是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用
(父子进程)。
2)有名管道:也是半双工的通信方式,可以允许在没有亲缘关系的进程间使用。
3)信号量:是一个计数器,可以用来控制多个进程对共享资源的访问,常作为一种锁机制,防止某
进程在共享资源时,其他进程也访问该资源。作为进程间以及同一个进程内不同线程之
间的同步手段。
4)消息队列:是由消息的链表,

你可能感兴趣的:(百度软件开发和测试面试)