天天看点

搜狐面试题 2011.07

1、算法时间复杂度

时间复杂度:主要分析关键字的比较次数和记录的移动次数。

2、根据二叉树中序、后序遍历结果活动前序遍历结果

前序序列的第一个元素就是树的根节点,在中序序列中找到这个根节点,在中须序列中根节点左边元素的就是根节点的左子树,根节点右边的元素就是根节点的右子树,然后在前序序列中,找到根节点

的左子树中最先访问的节点(即前序序列中下标最小的),该节点就是左子树的根节点。中序序列和后序序列就倒过来

比如 中序序列:421536

     先序序列:124356

1是根节点42是1的左子树,536是1的右子树

先序序列里是24所以4是2的子树,再根据中序序列里的42,得到4是2的左子树

先序序列里是356所以56是3的子树,再根据中序序列里的536,得到5是3的左子树,得到6是3的右子树

3、对数字倒排序如457000结果为754(编程题)

  public static Long dispose(Long param){
		if(param==null)return null;
		String args=param.toString();
		if(args==null&&args.length()<=0)return 0l;
		int j=args.length()-1;
		while(j>=0&&args.charAt(j)=='0'){
			j--;
		}
		if(j<0)return 0l;
		StringBuilder sb=new StringBuilder();
		while(j>-1){
			sb.append(args.charAt(j--));
		}
		return Long.valueOf(sb.toString());
	}
           

4、冒泡排序(编程实现)

5、UML建模,画出各实体类、接口的关系,补全实体类属性、方法(根据继承、接口等)

6、区分用例图、类图、活动图等

用例图由参与者(Actor)、用例(Use Case)、系统边界、箭头组成

用例图USE CASE图主要的作用有三个:(1)获取需求;(2)指导测试;(3)还可在整个过程中的其它工作流起到指导作用。

类图(Class diagram)由许多(静态)说明性的模型元素(例如类、包和它们之间的关系,

这些元素和它们的内容互相连接)组成。类图可以组织在(并且属于)包中,仅显示特定包中的相关内容。类图(Class diagram)是最常用的UML图,显示出类、接口以及它们之间的静态结构和关系;它用于描述系统的结构化设计。类图(Class diagram)最基本的元素是类或者接口。 

活动图

7、找出并删除/test文件夹中及子文件夹中3分钟前修改的以.c结尾的文件(Linux命令)

8、Linux中查看系统内存等信息使用情况的命令,解释结果意思

命  令: free

功能说明:显示内存状态。

语  法: free [-bkmotV][-s <间隔秒数>]

补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

参  数:

 -b  以Byte为单位显示内存使用情况。 

 -k  以KB为单位显示内存使用情况。 

 -m  以MB为单位显示内存使用情况。 

 -o  不显示缓冲区调节列。 

 -s<间隔秒数>  持续观察内存使用状况。 

 -t  显示内存总和列。 

 -V  显示版本信息。

9、对列出的url网址进行截取,如http://www.baidu.com中截取baidu,并对结果加排序序号(Linux命令处理)

10、设计数据库,对一个使用email登录注册的系统进行建表建索引,现有数据5000千万,每天增长20万,写出建表建索引语句,常用SQL语句

CREATE TABLE `user_loginemail_169` (
  `user_id` bigint(20) NOT NULL,
  `login_email` varchar(200) NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `lemail` (`login_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
           

11、java中线程一些知识

12、单例模式程序补全题,也就是填空

饿汉式

class Singleton {
  private static Singleton instance=new Singleton();
  private Singleton(){}
  static Singleton getInstance() {
      return instance;
  }
}
           

懒汉式

class Singleton {
  private static Singleton instance=null;
  private Singleton(){}
  static Singleton getInstance() {
      if(instance==null)
      instance=new Singleton();
      return instance;
  }
}
           

13、解决jsp页面中文乱码的方式

在<head>下面加上以下一行试试

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">如果不行,试试转码。

转码的三种方法:

A 接受参数时进行编码转换

String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8"); 这样的话,每一个参数都必须这样进行转码。很麻烦。但确实可以拿到汉字。

B 在请求页面上开始处,执行请求的编码代码, request.setCharacterEncoding("UTF-8"),把提交内容的字符集设为UTF-8。这样的话,接受此参数的页面就不必在转码了。直接使用

String str = request.getParameter("something");即可得到汉字参数。但每页都需要执行这句话。

这个方法也就对post提交的有效果,对于get提交和上传文件时的enctype="multipart/form-data"是无效的。稍后下面单独对这个两个的乱码情况再进行说明。

C 为了避免每页都要写request.setCharacterEncoding("UTF-8"),建议使用过滤器对所有jsp进行编码处理。 

14、jsp中的两种跳转方式,区别

Redirect和forward

forward 是服务器内部重定向,程序收到请求后重新定向到另一个程序,而客户机并不知晓;

forward会将   request  state、bean、等信息带到下一个jsp页面;

使用getAttribute()来取得前一个jsp所放的信息

redirect  是服务器收到请求后发送一个状态头给客户,客户将再次请求,就有两次网络通行的来往。

redirect 是送到客户端后再次request,因此上一个jsp的信息不被保留

在jsp中的session和cookie的关系

 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

    同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session

机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择。

jsp中两种包含文件的区别

相同点:两者都能包含一个页面不同点:区别1:<jsp:include page="b.jsp" />(先执行,后包含)此标签表示法:能动态区别加进来的是动态页面还是静态页面,对于静态页面则直接将资源包含(仅取其文本)。<%@ include file="b.jsp">此指令表示:静态地包含页面,不管其内容如何,不过是静态页面还是动态页面都首先将页面的内容先加进来。区别2:<jsp:include page="b.jsp" />可以分开写成:<jsp:include page="b.jsp" ><jsp:param name="参数名" value="参数值"/></jsp:include>这样就可以传递参数

15、解释AIO、BIO什么的

一、 Reactor and Proactor

IO读写时,多路复用机制都会依赖对一个事件多路分离器,负责把源事件的IO 事件分离出来,分别到相应的read/write事件分离器  。涉及到事件分离器的两种模式分别就是 Reactor和Proactor,Reactor是基于同步IO的,Proactor是基于异步IO的。

在Reactor模式中,事件分离者等待某个事件或者可应用或个操作的状态发生(比如文件描述符可读写,或者是socket可读写),事件分离者就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。

在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的  。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息  。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调  。举例来说,在Windows上事件处理者投递了一个异步IO操作(称有 overlapped的技术),事件分离者等IOCompletion事件完成. 这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写是由操作系统代劳的  。

举个例子,将有助于理解Reactor与Proactor二者的差异,以读操作为例(类操作类似)  。

在Reactor中实现读:

- 注册读就绪事件和相应的事件处理器

- 事件分离器等待事件

- 事件到来,激活分离器,分离器调用事件对应的处理器。

- 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

与如下Proactor(真异步)中的读过程比较:

- 处理器发起异步读操作(注意:操作系统必须支持异步IO)  。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件  。

- 事件分离器等待操作完成事件

- 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成  。

- 事件分离器呼唤处理器  。

- 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器  。

可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)  。在结构

上,两者也有相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler;

不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示

IO设备可以进行某个操作(can read or can write),handler这个时候开始提交操作  。

二、BIO、NIO、AIO

NIO通常采用Reactor模式,AIO通常采用Proactor模式  。AIO简化了程序的编写,stream的读取和写入都有OS来完成,不需要像NIO那样子遍历Selector  。Windows基于IOCP实现AIO,Linux只有eppoll模拟实现了AIO  。

Java7之前的JDK只支持NIO和BIO,从7开始支持AIO  。

4种通信方式:TCP/IP+BIO, TCP/IP+NIO, UDP/IP+BIO, UDP/IP+NIO  。

TCP/IP+BIO、

Socket和ServerSocket实现,ServerSocket实现Server端端口监听,Socket用于建立网络IO连接  。

不适用于处理多个请求 1.生成Socket会消耗过多的本地资源  。2. Socket连接的建立一般比较慢  。

BIO情况下,能支持的连接数有限,一般都采取accept获取Socket以后采用一个thread来处理,one connection one thread  。无论连接是否有真正数据请求,都需要独占一个thread  。

可以通过设立Socket池来一定程度上解决问题,但是使用池需要注意的问题是:1. 竞争等待比较多  。 2. 需要控制好超时时间  。

TCP/IP+NIO

使用Channel(SocketChannel和ServerSocketChannel)和Selector  。

Server端通常由一个thread来监听connect事件,另外多个thread来监听读写事件  。这样做的好处是这些连接只有在真是请求的时候才会创建thread来处理,one request one thread  。这种方式在server端需要支持大量连接但这些连接同时发送请求的峰值不会很多的时候十分有效  。

UDP/IP+BIO

DatagramSocket和DatagramPacket  。DatagramSocket负责监听端口以及读写数据,DatagramPacket作为数据流对象进行传输  。

UDP/IP是无连接的,无法进行双向通信,除非双方都成为UDP Server  。

UDP/IP+NIO

通过DatagramChannel和ByteBuffer实现  。DatagramChannel负责端口监听及读写  。ByteBuffer负责数据流传输  。

如果要将消息发送到多台机器,如果为每个目标机器都建立一个连接的话,会有很大的网络流量压力  。这时候可以使用基于UDP/IP的Multicast协议传输,Java中可以通过MulticastSocket和DatagramPacket来实现  。

Multicast一般多用于多台机器的状态同步,比如JGroups  。SRM, URGCP都是Multicast的实现方式  。eBay就采用SRM来实现将数据从主数据库同步到各个搜索节点机器  。

继续阅读