人人网-互联网公司面试题

1、  ping以及traceroute原理?

Ping:因特网包探索器,用于检测网络是否畅通,如果时间越长说明网络越慢,通过发送ICMP请求包,等待回应包,然后便知道了是否可以连通,大约时间是多少。

Traceroute:Windows系统往往是通过发送ICMP包,Unix系统往往是UDP。路由跟踪命令。就是先发送TTL为1的ICMP数据包,然后第一个路由器就会将TTL减少1,然后返回到源主机超时的包;然后再发送TTL为2的,依次类推,直到到达目的主机,然后返回的ICMP包不是超时包。


2、  操作系统资源调度?

资源分配:静态分配和动态分配

静态分配针对的是作业一级的,一次性把资源给够,然后运行,缺点就是资源利用率比较低;动态分配针对的是进程级别的,动态分配资源,缺点就是可能造成死锁。


3、  ip地址判断?

public static void getResult(List<String> answer, String temp, int curPos, int n, int potSize, String s){
        if(curPos == n && potSize == 4){
            answer.add(temp.substring(0,temp.length()-1));
            return;
        }
        if(potSize > 4) return;
        for(int i = 1; i <= 3 && (curPos + i) <= n; i++){
            String curS = s.substring(curPos,curPos+i);
            if(isVail2(curS)){
                getResult(answer,temp+curS+".",curPos+i,n,potSize+1,s);
            }
        }
}
深度优先遍历的套用代码模式,退出条件,然后每一层的可能情况。

4、  一个很大的文件,找到所有的敏感词?

个人想法:

最笨的方法就是遍历文件,然后每一个位置都截取出字符串与敏感词表进行比较,如果找到,那么就找到了;复杂度7n。

为每一个字简历一个倒排记录表,记录住出现的位置,然后看是否会出现这个词。

要不就是把相同开头的词弄成拥有共同索引的一组,然后在文章中判断是否出现了该索引,然后在索引指向的所有单词在文中的对应位置寻找。这样就不一定是m*n中。而且还可以快速一些。


5、  增加最少的字符变成回文?

动态规划问题,设dp[i][j]表示第i字符到第j字符之间要增加的字符数目。那么

D[i][j] = min{

当s[i] == s[j] 的时候,那么就是dp[i+1][j-1]

如果不相等:

Min{dp[i+1][j]+1,dp[i][j-1]+1}

}


6、二叉树最大高度的非递归实现?

7、Mapreduce的基本计算方法,给个例子?

答:比如统计大量文档中出现次数最多的单词,输入的键值对是<文档名或者编号,文档内容>,然后map做处理,生成键值对<单词,1>,然后reduce的时候就会产生<单词,list values>,然后统计list values多少就能知道单词多少了。

现在有个文件,可以设定划分为M份,然后master节点分配M台机器对应到M个划分子文件上面,然后map作业读取文件,调用map函数,生成中间结果,中间结果先保存在内存中,然后不定时存储到本地文件系统中,存储的时候会根据key值划分到R个区中存储,也就是存储的内容在本地文件系统中分为了R份。此时有R个机器用于做Reduce作业,就可以从指定的地址读取数据,Reduce作业对于所读分区的数据先根据相同的Key进行汇总,然后调用reduce函数,reduce作业的输出就是输出文件,输出文件个数是R个。不同文件中的key肯定是不同的。

http://blog.csdn.net/richerg85/article/details/19616559


8、Java中的文件操作?

字节为单位:

File f = new File(filename);

InputStream in = new FileInputStream(f);

In.read() != -1

In.read(byte[])

 

字符为单位:

File f = new File(filename)

Reader r = new InputstreamReader(newFileInputStream(f));

r.read() != -1

r.read(char[])

 

行为单位:

File f = new File(filename)

BufferedReader reader = newBufferedReader(new FileReader(f));

 reader.readLine()

 

随机访问:

RandomAccessFile raf = newRandomAccessFile(filename,’r’)

Raf.seek(height);

Raf.read()

 

Fileoutputstream fos = newFileOutPutstream(new File())

BufferedOutputstream = newBufferedOutputStream(new File())


9、 多进程和多线程?

进程里面有多线程,就比如java里面的多线程;进程可以认为是应用程序,多进程就好比一边听歌一边上网,对于多核机器,那么完全可以做到并行执行。如果进程数大于CPU数目,就是并发执行。线程是分配CPU的单位,进程是分配系统资源的单位。


10、各种二分查找的知识?

http://blog.csdn.net/gexiaobaohelloworld/article/details/10831543

(1)      递归二分查找

(2)      非递归二分查找

(3)      返回某元素是否存在,如果不存在,插入位置。其实就是正常的二分查找,最后low的位置即插入的位置。

(4)      含重复元素,求第一个等于target的位置和最后一个等于target的位置。正常弄,只是当等于的时候,先判断一下自己左边或者自己右边的元素是否仍然是target,然后变化区间。这个简单的处理就是在等于的时候。记住喔。

(5)      含重复元素,求小于target的最大一个或者大于target的最小一个。可以借助于重复元素求最前和最后一个,然后前后的元素便是所求,只是要判断一下范围,不能越界。

(6)      有序数组,求绝对值最小的元素位置。其实就是求正负号变化位置的元素,那么就可以二分找,判断条件就是中间位置的元素大于0还是小于0,然后调整区间。最后判断的是low-1和low两个位置的绝对值大小。

(7)      一个有序数组,没有重复元素,问旋转后是否存在target。两种情况,中间元素小于左边元素,那么这个时候右面肯定是有序的,判断是否在右面,如果不在,那么就限制在左边了。否则就判断左边有序时候是否能包括这个元素。

(8)      一个有序数组,无重复元素,问旋转后的最小值。如果中间元素大于左边元素,那么最小值在右边,否则在左边。

(9)      一个有序数组,无重复元素,旋转之后的第K小值。


11、Spring的控制反转和依赖注入,面向切面编程?

         http://pandonix.iteye.com/blog/336873/

         比如说日志打印功能,是穿插在每一个类和函数中的。就可以通过切面编程来做。切面编程达到的效果其实就是通过编译时的注入或者动态代理来做这件事情。连接中给出了一个例子,先写了一个testAspect类,里面有doAfter和doBefore方法,然后写了两个服务类。通过在ApplicationContext配置文件中配置后对应的服务类所需要的切面方法。然后在执行的过程中就会有切面达到的效果了。


12、Tomcat的工作原理以及响应顺序?

   http://blog.csdn.net/jiandanfeng2/article/details/7342667

  假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector
把该请求交给它所在的ServiceEngine来处理,并等待来自Engine的回应
3) Engine
获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine
匹配到名为localhostHost(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host
获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host
匹配到路径为/wsotaContext(如果匹配不到就把该请求交给路径名为""Context去处理)
7) path="/wsota"
Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context
匹配到URL PATTERN*.jspservlet,对应于JspServlet
9)
构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServletdoGetdoPost方法
10)Context
把执行完了之后的HttpServletResponse对象返回给Host
11)Host
HttpServletResponse对象返回给Engine
12)Engine
HttpServletResponse对象返回给Connector
13)Connector
HttpServletResponse对象返回给客户browser

13、Http请求,报头什么的?

Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。 Get的参数出现在URL里面,post的参数出现在http数据包中;get传递数据有大小限制,一般是1024个字节,post没有限制。	

当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:

l   请求方法URI协议/版本

l   请求头(Request Header)

l   请求正文

下面是一个HTTP请求的例子:

GET/sample.jspHTTP/1.1

Accept:image/gif.image/jpeg,*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible;MSIE5.01;WindowNT5.0)

Accept-Encoding:gzip,deflate

 //请求头和请求正文中间有一个空格

username=jinqiao&password=1234

HTTP应答与HTTP请求相似,HTTP响应也由3个部分构成,分别是:

l 协议状态版本代码描述

l 响应头(Response Header)

l 响应正文

下面是一个HTTP响应的例子:

HTTP/1.1 200 OK

Server:ApacheTomcat/5.0.12

Date:Mon,6Oct200313:23:42 GMT

Content-Length:112


14、多线程如何通信?

http://www.cnblogs.com/newthing/archive/2008/01/30/2157786.html

    Java提供了3个非常重要的方法来巧妙地解决线程间的通信问题。这3个方法分别是:wait()notify()notifyAll()。它们都是Object类的最终方法,因此每一个类都默认拥有它们。虽然所有的类都默认拥有这3个方法,但是只有在synchronized关键字作用的范围内,并且是同一个同步问题中搭配使用这3个方法时才有实际的意义。

调用wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行态退出,进入等待队列,直到被再次唤醒。而调用notify()方法可以唤醒等待队列中第一个等待同一共享资源的线程,并使该线程退出等待队列,进入可运行态。调用notifyAll()方法可以使所有正在等待队列中等待同一共享资源的线程从等待状态退出,进入可运行状态,此时,优先级最高的那个线程最先执行。显然,利用这些方法就不必再循环检测共享资源的状态,而是在需要的时候直接唤醒等待队列中的线程就可以了。这样不但节省了宝贵的CPU资源,也提高了程序的效率。


15、 多线程中callable与runnable

(1)    callable里面调用的是call方法,runnable里面调用的是run方法。

(2)    callable里面的call方法是有返回值的。run是没有返回值的。

(3)    callable里面可以捕获异常,而run里面是不可以捕获异常的。

Callable的调用方式:

比如在一个实现了callable的接口里面,方法call的返回值是String类型的,那么我们想获取线程返回的结果,就要通过以下方式获取结果:

1.  ExecutorService exec = Executors.newCachedThreadPool();  

2.          ArrayList<Future<String>> results = new ArrayList<Future<String>>();    //Future 相当于是用来存放Executor执行的结果的一种容器  

3.          for (int i = 0; i < 10; i++) {  

4.              results.add(exec.submit(new TaskWithResult(i)));  

5.          }  

注意使用的是ExecutorService,然后调用的是exec.submit方法。

Future中有两个方法:cancle方法,表明是否结束当前任务,参数为true的时候结束任务,false是允许任务执行到结束;get方法,等任务结束后返回结果。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值