现在的位置: 首页 > 综合 > 正文

我在北京找工作(六):备战阿里巴巴java笔试<2>:前人的阿里总结

2017年12月16日 ⁄ 综合 ⁄ 共 23416字 ⁄ 字号 评论关闭

1.      假设有Alibaba网站最近一个月的查询日志,记录了用户的查询行为,每条查询都至少包含有一个产品词,称之为查询意图,总计有查询意图3000万条,请统计出这3000万条。

 

2.      为了保护我们的地球,全世界都在倡导绿色环保,在高效能计算和绿色计算方面,请谈谈你的一些想法。

 

3.      聊聊最近最吸引你的互联网事件,谈谈你对此事件的看法。

 

4.      在进入我的淘宝页面时,此页面需要获取登陆的用户相关信息。在访问量少的情况下,可以采用直接访问数据库的方式;但当访问量太高时,会导致数据库压力过高,因此通常采取的方法为将用户信息进行缓存。在用户数不多的情况下,这个方案还是提供了很大的帮助的;但用户数增多了一点后,出现的问题就是缓存占用了太多的内存,而经过分析,原因是这些缓存中有很多是不访问的用户信息。

1.1 请写一段存储用户信息的缓存实现代码,并实现缓存到达一定大小后,如继续新增用户信息,则将最近不访问的用户信息从缓存中踢出。

1.2由于我的淘宝是部署在多台机器上的,如果用户每次访问不同的机器,以上方案会造成每台机器都需要去数据库中加载此用户信息,请给出一个方案来避免此问题。

 

5.      有阿里巴巴每层办公室茶水间都有一台饮料自动贩卖机,可选饮料包含有奶茶,咖啡,果珍等,由于是公司福利不需要投币即可私用,先假定每层员工为500名,请写出针对饮料自动贩卖机的测试方法。

 

6.      你接触过哪些LINUX发行版,请比较一下这些发行版的优缺点。

 

7.      用3个关键词表现你想从阿里巴巴得到什么?

兴趣,梦想,成功

8.      连接两个单向链表,返回排序后的结果。

9.      c语言能否进行面向对象的设计和编程?为什么?如果可以,怎么实现?

10.  extjs里对一个支持事件监听的控件,取出监听器的方法有哪些?

11.  Apach Web Server区别于其他应用服务器的主要特点是什么?

12.  Java的特点是什么?

13.  Web层的主要作用?

14.  五种颜色涂到一个田字格里,相邻两个格子的颜色不能相同,颜色可以重复使用。问你一共有多少种涂法?

15.  一天24小时内,时针、分针、秒针一共重合多少次?

16.  一个牧场的草,10头牛可以吃20天,15头牛可以吃10天,并且每天牧场的草都是均匀的生长,问你25头牛可以吃多少天?

17.  菲波纳契数列f(i)11235.。。。。问你f(50)-1最少可以写成多少个菲波纳契数之和?

18.  提高网络安全你有什么建议?

19.  对下一代互联网你有什么设计?

20.  在平面上有n个点,(x1,y1),(x2,y2)...(xn,yn),请用最快的算法找到是否有三个点共线。

21.  关于图片文件存储的一个开放性的题目。

22.  有一颗树,每一个树节点存储着一个数字,现在想要找到两个相同的节点(这两个节点存储的数字及其所有子树均相等)。[查找树中相同节点对]

思路1:

1)    首先通过一个遍历(如前序遍历)得到一个数字序列,并对树中的叶

子节点在这个序列中做标记(现在问题退化为在一个数字串中找出重

复的字符串,且这些字符串应该是以标记的叶子节点结尾的)。

2)    采用后缀树可以很方便的求得相同的数字串序列。

3)    验证2)中得到的结果(应该是一个小结果集) 是否满足要求,验证

的时间复杂度应该是比较小的。

思路2:

1)    对树中的每一个节点设定一个权值,这个权值为其所有子节点的权值

及其自身数字值之间的乘积(可能需要bignumber,或者考虑将这些

数字进行移位异或)。

2)    采用后序遍历,计算每一个节点的权值,并顺带记录其树深度。统计

权值和深度均相同的节点。

​3) 验证2)中得到的结果是否满足要求,验证的时间复杂度应该是比较

小的。

23.  参加百年阿里培训的N位同学结伴去西湖旁边为游人指路,两人一组,他们打算先让体重之和恰好为102公斤的同学一组,请给出一个算法找到这样的组合,或者确定他们之间不存在这样的组合,其中最有的算法复杂度为?(假设体重恰好为整数)

------解决方案--------------------------------------------------------
比如A B C D E,其中2*C = F,则以C为分割点,两边对称取组合,满足要求了

------解决方案--------------------------------------------------------
(a)从小到大排序成大小为n的数组Array
(b)定义下标i=0, j=n-1
(c)若Num=Array[i]+Array[j],则输出,且i++,j--;
 若Num>Array[i]+Array[j],则i++;
 若Num<Array[i]+Array[j],则j--
(d)若i<j,则转至第3步;否则结束(找出分割点

24.  简述隐马尔可夫模型(HMM)的三个基本问题。

令 λ = {A,B,π} 为给定HMM的参数,σ = O1,...,OT 为观察值序列, 隐马尔可夫模型(HMM)的三个基本问题为:

(1)    评估问题:对于给定模型,求某个观察值序列的概率p(σ|λ) ;

向前算法 (a)定义向前变量(b)采用动态规划算法,复杂度  。

(2)    解码问题:对于给定模型和观察值序列,求可能性最大的状态序列;

       韦特比(Viterbi)算法 (a)采用动态规划算法,复杂度 。

(3)    学习问题:对于给定的一个观察值序列,调整参数λ,使得观察值出现的概率p(σ|λ)最大;

向前向后算法  (a)EM算法的一个特例,带隐变量的最大似然估计。
     隐马尔科夫模型(hidden Markov model,缩写为HMM)的提出最初是在语音处理领域。HMM是在Markov链的基础上发展起来的一种统计模型。由于实际问题比Markov链模型所描述的更为复杂,因此在HMM中观察到的事件与状态并不是一一对应,而是与每个状态的一组概率分布相联系。它是一个双重随机过程,其中之一是Markov链,描述状态的转移;另一个描述每个状态和观察值之间的统计对应关系。这样,HMM以概率模型描述观察值序列,具有很好的数学结构,能够比较完整地表达观察值序列的特征。

评估问题:对于给定模型,求某个观察值序列的概率p(σ|λ) ;

解码问题:对于给定模型和观察值序列,求可能性最大的状态序列;

学习问题:对于给定的一个观察值序列,调整参数λ,使得观察值出现的概率p(σ|λ)最大。

HMM的状态是不确定或不可见的,只有通过观测序列的随机过程才能表现出来;观察到的事件与状态并不是一一对应,而是通过一组概率分布相联系;HMM是一个双重随机过程。

25.  有两个有序整数集合a,b。请写一个函数,实现找出a,b集合中的交集,并打印出来。(见试卷)

26.  分析Merge Sort的原理及算法复杂度,并用最擅长的编程实现MergeSort。

原理:“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到 个长度为2或者1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。它的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。

算法复杂度和编程见笔记。

27.  给定一个数t,以及n个整数,在这n个数找到加和为t的所有组合,例如t=4,n=6,这6个数为【4,3,2,2,1,1】,这样输出就有4个不同的组合他们的加和为4:4,3+1,2+2 and 2+1+1,请设计一个高效算法实现这个需求。

http://blog.chinaunix.net/space.php?uid=22753395&do=blog&id=1769851

(a)解题思路

先将数据按从大到小进行排序,然后使用回溯法遍历所有可能。注意去掉重

复的结果。

(b)代码实现

#include<iostream>
using namespace std;
int a[100]={4,3,1,2,1,2};
bool x[100];//标记第i个元素是否已经使用
int N=6;//元素个数
int t=4;//目标和
int sum;//当前和
int cmp(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}
void backtrace(int n)
{
    if(sum>t)//当前和大于t
        return ;
    if(sum==t)//当前和等于t,输出结果
    {
        for(int j=0;j<n;++j)
        {
            if(x[j])
                cout<<a[j]<<" ";
        }
        cout<<endl;
        return;
    }
    if(n==N)//超过n层
        return ;
    for(int i=n;i<N;++i)
    {
        if(x[i]==false)//未使用
        {
            x[i]=true;
            sum+=a[i];
            backtrace(i+1);
            x[i]=false;
            sum-=a[i];
            while(i<N-1 && a[i]==a[i+1])//跳过相同的
                i++;
        }
    }
}
int main()
{
    sum=0;
    memset(x,0,sizeof(x));
    qsort(a,N,sizeof(a[0]),cmp);
    backtrace(0);
    return 0;
}

28.  抽象类和接口的区别

29.  用户级线程和核心级线程的区别是什么?

(1)用户线程:由应用进程利用线程库创建和管理,不来于操作系统核心。不需要用户态/核心态切换,速度快。操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。

(2)内核线程: 由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。

30.  用最快的算法写出计算2*17的方法

答案: 17<<1 (移位操作)

31.  有n个人围成一圈,从第一个人开始报数,报到m的时候把这个人剔出,从下一个继续报数,报到下一个m的时候剔出该人,如此循环,直到所有人都被剔出.用java写一个程序,输出剔出的人的序号.这n个人的序号是1,2,3,…n..

这是我写的,测试通过,仅供参考.

import java.util.Scanner;

publicclass NandM {

publicstaticvoid main(String args[]){

        Scanner s=new Scanner(System.in);

        int n=s.nextInt();

        int m=s.nextInt();

        int i=0,j=0,k=0,result=0;

        int a[]=newint[n];

        for(i=0;i<n;i++)

               a[i]=0;

        i=0;

        while(true){

               if(a[i]==0)

                      j++;

               if(j==m){

                      System.out.println(i+1);

                      a[i]=1;

                      j=0;

                      result=0;

                      for(k=0;k<n;k++)

                             result+=a[k];

                      if(result==n)

                             break;

               }

               if(i==n-1)

                      i=0;

               else

                      i++;

        }

}

}

32.  final,finalize,finally的区别?

http://blog.csdn.net/lvinging/article/details/5651742

答:final主要用于说明该类不能派生新子类,或表示该变量在使用过程中不被改变,用于方法时表示该方法不能被重载。

Finalize为对象方法,主要用于在对象清除出内存前做必要的清理工作。

Finally主要用于提示在异常处理结束时,必须处理的函数块。

33.  简述ArrayLists和LinkedList的区别?

34.  实现点击页面上的一个链接,然后隐藏这个链接的javascript代码。

35.  C/S架构,B/S架构融合

36.  equals()方法:比较两个对象的类型和值; ==:比较两个对象的地址

37.  简述template 和 Strategy设计模式的区别

   模板-------设计模式

适用条件:

1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3) 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。

解决方案:

1) AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
2) ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。
实例:

public abstract class Bank {
private double lilu;      // 利率
private double fond;   // 本金
public double getFond() {
   return fond;
}
public void setFond(double fond) {
   this.fond = fond;
}
public double getLixi(){    //抽象类中的模板方法其中调用了一个抽象方法
   return getFond()*getLilu();
}
public abstract double getLilu(); //抽象类中的抽象方法

}

public abstract class m_ChinaBank extends Bank { 

//另一个抽象类.继承了上一个抽象类
private double time ;     //时间
public double getLixi(){                  //override基类中的模板方法
   return getFond()*getLilu()*getTime();
}
public double getTime() {
   return time;
}
public void setTime(double time) {
   this.time = time;
}
}

public class ChinaBank extends m_ChinaBank {

public static void main(String[] args){
   ChinaBank bk = new ChinaBank();
   bk.setFond(1000000);
   bk.setTime(100);
   System.out.println(bk.getLixi());
}
public double getLilu() {          //实现抽象类中的抽象方法.
   return 0.0003;
}
}

注意本例中模板设计模式只有三个类就可以完全表现出模板设计模式.为什么还要加上中间的一个类呢.主要是为了演示怎样在程序完成之后根据客户的需求来升级程序之用.在中间类中我们重写了getLixi()方法.改变了利率的计算方式.

12.说说你对测试驱动开发(TDD)的理解.

(1)测试驱动开发(Test-Driven Development):是敏捷开发中的一项核心实践和技术,也是一种设计方法论。是极限编程的一个重要组成部分,它的基本思想就是在开发功能代码之前,先编写测试代码。

(2)TDD的原理:在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代理。

(3)TDD基本思路:通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把 需求分析,设计,质量控制量化的过程。

(4)TDD的重要目的:不仅仅是测试软件,测试工作保证代码质量仅仅是其中一部分,而且是在开发过程中帮助客户和程序员出去模棱两可的需求。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是变成测试用例框架对功能的过程和接口进行设计,而测试框架可以持续验证。

 

13 线程间通知和唤醒

http://www.cnblogs.com/duanjie/archive/2012/04/26/2489175.html

14 线程安全

(a)    如果要求线程安全,使用Vector、Hashtable;  enum,stack

(b)   如果不要求线程安全,应使用ArrayList,LinkedList,HashMap;

(c)    如果要求键值对,则使用HashMap,Hashtable;

(d)   如果数据量很大,又要线程安全,则考虑Vector。

15    Ioc和aop

ioc就是控制翻转或是依赖注入。通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过spring的bean工厂为你长生这样一个对象。

aop就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类,那你每一类中都要写关于日志的方法。但是如果你用aop,那么你可以写一个方法,在这个方法中有关于数据库操作的方法,每一次调用这个方法的时候,就加上生成日志的操作。

16 Comparator和Comparable的区别 

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。 
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用: 
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身 
2、可以使用多种排序标准,比如升序、降序等 

 

17  HTTPSession失效转移

http://hi.baidu.com/spstreetpoet/item/366f5fcad82e68105050588a

 

 

18  jdbc事务隔离级别

 

 

知识点:

(1)java中sleep执行完之后,线程进入什么状态,就绪还是准备状态,另外问一下yield()执行完呢?还有join呢?

sleep执行完后,线程进入睡眠状态,只有当睡眠时间到达(sleep interval expires)或者被打扰(interrupted)才进入就绪状态(ready);线程调用yield()执行完后使相同优先级的线程都获得运行的机会。yield方法只用于非分时的系统中;线程调用join()方法后,等待该线程的终止。形参列表中可以设定终止需要的时间。

(2)JDBC的主要作用?

JDBC是由一系列连接(Connection)、SQL语句(Statement)和结果集(ResultSet)构成的,其主要作用概括起来有如下3个方面:
建立与数据库的连接。
向数据库发起查询请求。
处理数据库返回结果。

 Connection con = DriverManager.getConnection("jdbc:odbc:wombat","login",  "password"); 
  Statement stmt = con.createStatement(); 
  ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); 
  while (rs.next()) { 
  int x = rs.getInt("a"); 
  String s = rs.getString("b"); 
  float f = rs.getFloat("c"); 
  }

(3) springMVC中的中心控制Servlet是那个类?

简介:spring内建了一个请求驱动的web mvc框架,以一个servlet分发器为中心,将web请求分发到各个不同的处理器进行处理(这点和struts很相似)。这个servlet就是spring提供的DispatcherServlet,它必须在web.xml里配置。当然web.xml里可以配置多个DispatcherServlet,每个DispatcherServlet都会加载和自己相关的web应用上下文(即和应用相关的xml文件)。

例如:
<servlet>
     <servlet-name>jpet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           <load-on-startup>2<load-on-startup>
<servlet-mapping>
     <servlet-name>jpet</servlet-name>
     <url-pattern>*.do</url-pattern>
</servlet-mapping>
</servlet>
以上的配置表示所有“.do”结尾的请求都交DispatcherServlet来预处理(分发)。在web-inf下,spring默认查找jpet-servlet.xml作为程序应用上下文。

 

(4)redirect不会默认产生301 Permanently moved的HTTP响应。

301 Moved Permanently 
客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。 301重定向是指当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
301重定向可促进搜索引擎优化效果,从搜索引擎优化角度来看,301重定向是网址重定向最为可行的一种办法。当网站的域名发生变更后,搜索引擎只对新网址进行索引,同时又会把旧地址下原有的外部链接如数转移到新地址下,从而不会让网站的排名因为网址变更而受到影响。同样,在使用301永久性重定向命令让多个域名指向网站主域时,亦不会对网站的排名产生任何负面影响。

 

(5)文件句柄可用变量

http://bdxnote.blog.163.com/blog/static/8444235200836252655/

对于open、close、print 、printf、write、select、eof等文件操作函数,都可以使用简单的标量变量来替换这些函数的文件句柄参数,这时,简单的标量变量中所存储的数据必须是字符串类型,这些字符串就被看作文件句柄名称;需要指出的是,open、close、write、select和eof等文件操作函数还允许使用表达式来替代文件句柄,但是表达式的值必须是字符串,被用做文件句柄名称;有了这样的特性,我们就可以通过随意地构造字符串来动态地构造文件句柄名称,以达到操作不用文件的目的;使用简单变量替换文件句柄参数的语法如下:

$FileHandle  =  "INFILE";

$OpenFlag  =  open($FileHandle,"FileName1");

$FileHandle  =  "OUTFILE";

$OpenFlag  =  open($FileHandle,"FileName2");

在这些语句中,简单变量$FileHandle的值是可以随意变化的,这样简单变量$FileHandle每取一个不同的字符串,就可以打开一个与这个字符串所对应的文件,并生成一个对应的文件句柄;但是必须注意:这些简单变量或者表达式的值必须是字符串,以用做文件句柄名称;

 

(6) hashtable和trie

哈希表最快

二叉树 trie都是 O(log(n))

链表 On)肯定不行

数据大小说明了  n>1024  ==>  log(n) > 10

如果不限制内存开销,哈希表可以做到冲突非常少,一次就能检索到

(7)飞机加油环球 

http://www.toyear.info/?p=161#more-161

(8)称石头

挑出两颗,把剩下6颗分成两份称重:

1、一样重,则再称一下挑出的那两颗即可

2、不一样重,排除较轻的三颗,剩下3颗挑一颗出来,称其余两颗。如果一样重,则挑出的那颗便是,如果不一样重,重的那颗便是。

 

 

(9)tar(tapearchive)

功能说明:备份文件。

语    法:tar[-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b<区块数目>][-C<目的目录>][-f<备份文件>][-F<Script文件>][-K<文件>][-L<媒体容量>][-N<日期时间>][-T<范本文件>][-V<卷册名称>][-X<范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

-x或--extract或—get   从备份文件中还原文件。

-v或—verbose  显示指令执行过程。

-z或--gzip或—ungzip  通过gzip指令处理备份文件。

-f<备份文件>或--   file=<备份文件>  指定备份文件。

-C<目的目录>--directory=<目的目录>切换到指定的目录。

 

 

(10)软件测试对象

根据软件定义,软件包括程序、数据和文档,所以软件测试并不仅仅是程序测试。软件测试应贯穿于整个软件生命周期中。在整个软件生命周期中,各阶段有不同的测试对象,形成了不同开发阶段的不同类型的测试。需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为“软件测试”的对象。

在软件编码结束后,对编写的每一个程序模块进行测试,称为“模块测试”或“单元测试”;在模块集成后,对集成在一起的模块组件,有时也可称为“部件”,进行测试,称为“集成测试”;在集成测试后,需要检测与证实软件是否满足软件需求说明书中规定的要求,这就称为“确认测试”。将整个程序模块集成为软件系统,安装在运行环境下,对硬件、网络、操作系统及支撑平台构成的整体系统进行测试,称为“系统测试”。

为了把握各个环节的正确性,人们需要进行各种验证和确认(verification & validation)工作。

验证(verification)是保证软件正确实现特定功能的一系列活动和过程,目的是保证软件生命周期中的每一个阶段的成果满足上一个阶段所设定的目标。

确认(validation)是保证软件满足用户需求的一系列的活动和过程,目的是在软件开发完成后保证软件与用户需求相符合。验证与确认都属于软件测试,它包括对软件分析、设计以及程序的验证和确认。

 

(11)Servlet防止页面被客户端缓存

服务器端的HttpServlet可通过设置特定HTTP响应头来禁止客户端缓存网页,以下示范代码中的response变量引用HttpServletResponse对象:

response.addHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expires","0");

“Pragma”选项适用于采用HTTP 1.0的浏览器。HTTP 1.1中,“Cache-Control”选项用来决定客户端是否可以缓存网页,如果取值为“no-cache”,那么客户端不会把Servlet生成的网页保存在本地缓存中。HTTP
1.0和HTTP 1.1都支持“Expires”选项,因此所有的浏览器都能识别该选项。“Expires”选项用于设定网页过期的时间,如果为零,就表示立即过期。如果用户重复请求访问该网页,那么浏览器每次都应该从服务器端获取最新的网页数据。

 

(12)Class OutOfMemoryError

java.lang.Object

  java.lang.Throwable

      java.lang.Error

          java.lang.VirtualMachineError

              java.lang.OutOfMemoryError

http://online.chinaitpower.com/api/jdk150/index.html  在线api

http://online.chinaitpower.com/api/j2ee131/index.html  Servlet

http://online.chinaitpower.com/

 

(13)JSP ——JSP引擎转换为Servlet(.java)——Java编译为.class文件——由Java虚拟机解释执行

 

(14)jsp页面输出类型选择(HTML或EXCEL)

一、如果JSP页面输出的格式为HTML,则在JSP面页中作如下配置即可: 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> 
二、如果JSP页面输出的格式为EXCEL,则在JSP面页中作如下配置即可: 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="application/vnd.ms-excel; charset=UTF-8"%> 
注:contentType="application/vnd.ms-excel; charset=UTF-8"中的vnd.ms-excel即设置为EXCEL格式显示

 

 

 

(15)开-闭原则:一个软件实体应该对扩展开放,对修改关闭。

满足开闭原则的模块符合下面两个标准:

对扩展开放 ------- 模块的行为可以被扩展从而满足新的需求。

对修改关闭 ------- 不允许修改模块的源代码。(或者尽量使修改最小化)

(16)HttpServlet详解

http://www.cnblogs.com/panjun-Donet/archive/2010/02/22/1671290.html

 

(17) synchronized和wait()、notify()的关系 

http://blog.163.com/sunflower123_happy/blog/static/17327442120112264383864/

(18)请说说XML中<xs:sequence><xs:choice>和<xs:all>之间的区别?

sequence中定义的元素,在XML中必须按组内定义的先后顺序依次出现。

choice中定义的元素就如同枚举一样,定义的一组元素在XML中只能任意出现一个。

all定义的一组元素要出现就都出现,但先后顺序任意,all中的元素最多只能出现一次。

(19)领域模型

领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

(20)Servlet的生命周期是什么?

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

(21)自动提交模式

最大限度减少事务开销的第一个方法是通过把多个操作移到一个单一事务中来合并事务。默认情况下,JDBC连接工作在自动提交模式下,这就意味着每个发送到数据库的操作都会作为独立事务自动执行。在这种情况下,每个Statement.execute()方法调用都如同由一条BEGIN TRANSACTION命令开始,并由一条COMMIT命令结束。

关闭自动提交模式并且明确定义事务需要进行大量额外的工作,因为你必须手动添加事务划分语句(COMMIT和ROLLBACK)。但是合并事务可以减少性能开销,特别是当你对你的系统进行伸缩时。(下面的"批量更新"部分会涉及到合并更新事务的技术细节。)在重负荷系统中,事务开销意义重大。开销越低,系统的可伸缩性就越好。

简单地使用Connection.setAutoCommit(false)命令来关闭自动提交模式。

JDBC API还提供了一个Connection.getAutoCommit()方法来返回当前的自动提交模式。当你关闭了自动提交模式,你将需要使用两个事务划分方法:Connection.commit()Connection.rollback()

当人工控制事务时,需要遵循以下几条原则:使事务尽可能保持简短,不要在一个事务中包含很多操作使它们变得非常冗长。(使事务打开并保持行开锁状态,会影响其他事务并降低可伸缩性。)然而,如果几项操作可以一项接一项地执行,那么就把它们合并到一个事务中。

合并操作可能需要在你的SQL语句中增加额外的条件逻辑,并且可能需要临时表。不管这个开销,合并事务会更加有效,因为数据库可以在一个步骤内获得所有需要的锁,并在一个步骤内释放它们。

当自动提交模式没有关闭时,它所引起的更多事务会产生更多的通信开销,更多的锁定和释放时间,以及与其他会话发生冲突的更大可能性。

(22)crawler爬取

根据抓取过程蜘蛛主要分为三个功能模块,一个是网页读取模块主要是用来读取远程Web服务器上的网页内容,另一个是超链分析模块,这个模块主要是分析网页中的超链接,将网页上的所有超链接提取出来,放入到待抓取URL列表中,再一个模块就是内容分析模块,这个模块主要是对网页内容进行分析,将网页中所有超标志去掉只留下网页文字内容。

 

(23) 服务器返回的各种HTTP状态码介绍

http://down.chinaz.com/server/201103/157_1.htm

100系列码

从100到199范围的HTTP状态码是信息报告码。基于各种原因考虑,大多数情况下我们 是很少看见这些代码的。首先,如果一个浏览器尝试访问一个网站,而网站返回这些代码时,它们往往都不会显示在屏幕上。它们只是浏览器使引用的内部码。另 外,这些代码不常见的另外一个原因是起初HTTP标准不允许使用这一范围的状态码。就其本身而言,它们也一直没有被广泛地使用。

200系列码

从200到299范围的状态码是操作成功代码。同样的,在正常的Web上网中,你也很可能不曾在屏幕上看到这些代码。相反的,这些代码是在浏览器内部使用的,用以确认操作成功确认和当前请求状态。虽然这些代码通常不显示,但是有一些故障排除工具能够读到它们,就像和其它大多数的HTTP状态码一样,它们在错误诊断过程中是非常有用的。

300系列码

从300到399范围的状态码是重定向代码。本质上,它们告诉Web浏览器必须执行其它一些操作以完成请求。基于这个命令的特点,它可以自动地执行,或者要求额外的用户输入。比如,状态码301表示一个特定资源已经被永久地先移除,因此将来所有访问该资源请求都应该定向到一个特定的URL上。

400系列码

在400范围的状态码是客户端错误码。这种类型的错误码往往跟安全相关。比如,如果一个客户端尝试访问一个未授权访问的资源,服务器就会返回一个状态码401。类似地,如果客户端尝试访问一个禁止的资源,在这种情况下客户端的认证状态是一样的,那么服务器可能会返回一个状态码403,表示禁止对该资源进行访问。

如果请求不正确或客户端超时,400级错误码也可能被返回。然而,有一个400级的代码总是具有误导性:404。虽然这个代码在技术上被归类为客户端错误,但是事实上它可以同时表示客户端或服务器上的错误。但这个错误码只是简单地显示为没有找到请求的资源。当这个错误发生在客户端时,它往往表示的是网络连接问题。在其他时候,这个错误的发生还可能是由于资源已从服务器上转移或重命名而造成的。

500系列码

500级状态码表示的是服务器错误。比如,如果Web服务器超时,它就会产生一个504错误。虽然,一个500级的错误往往表示的不是服务器的问题,而是在服务器上运行的Web应用的问题。比如,我自己的个人网站是用ASP编写的,它负责动态生成HTML网页。在调试的过程中,有Bug的代码总会导致我的Web服务器返回HTTP状态码500,该代码是一般表示内部服务器错误。这个代码只是出 现问题了,并且HTTP无法解决该问题。

 

(24)分布式应用通信协议

http://neoremind.net/2012/05/%E5%88%86%E5%B8%83%E5%BC%8F%E5%BA%94%E7%94%A8%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/

历史

第一轮:HTTP,带来了Internet与电子商务
第二轮:Java,cross-platform,最早的RMI
第三轮:XML,标准的数据封装技术,各种App之间交换数据不再是难事。
第四轮:RPC,Webservice、REST、高性能通信协议

 

(25)static作用(修饰函数、局部变量、全局变量)

http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html

1. static全局变量与普通的全局变量有什么区别 ?

  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。

  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 

  static全局变量只初使化一次,防止在其他文件单元中被引用;   

2.  static局部变量和普通局部变量有什么区别 ?

   把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  

  static局部变量只被初始化一次,下一次依据上一次结果值;   

3.  static函数与普通函数有什么区别?

   static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

 

(26)典型的针对系统漏洞的Dos攻击有哪些? 

http://blog.163.com/freecool1987@126/blog/static/142733162201121584423666/

常见的DOS/DDOS攻击可以分为两大类:一类是针对系统漏洞的的攻击如Ping of Death、TearDrop等,另一类是带宽占用型攻击比较典型的如UDP flood 、SYN flood、ICMP flood等。

DDoS的攻击类型目前主要包括三种方式,即TCP-SYN Flood攻击、UDP Flood攻击以及提交脚本攻击。

 

(27)项目的特性

http://yingyu.100xuexi.com/view/examdata/20100708/071C235A-4B35-4A02-8F0F-82AD570A7560.html

 

(28)请用最少的额外空间将一个M*N的矩阵旋转90度,写出算法描述和类c语言程序;

(29)完成如下函数,给定分子和分母,输出其小数表示形式,循环节用[]表示,例如给出分子:13,分母19,输出为:0.[13]

#include "stdafx.h"

#include <iostream>

 

using namespace std;

 

int main()

{

const int M = 5;

const int N = 3;

 

int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

int* p = a[0];

 

//转90度后的矩阵设为b[N][M],则 b[i][j] = *(p + i + j*N)

for(int i = 0; i < N; i++)

{

for(int j =0; j < M; j++)

{

cout<< *(p + i + j*N) <<",";

}

 

cout<<endl;

}

 

system("pause");

 

return 0;

}

 

(30)已知一个整数数组a,给定一个整数x,判断x是否数组a中某两个数之和?

这是今年10月阿里巴巴在西安的笔试题,面试时也问到:

虽然很简单,但优化算法不知如何写:

 

我的算法是:

 

for(i=0;i <N;++i)

{

    for(j=i+1;j <N;++j)

    {

        if(x==a[i]+a[j])

            return 1;  //true

    }

}

return 0;    //false

 

在《算法导论》里有一道这样的习题,我的答案是:

1.首先对数组进行排序,用时O(nlgn);

2.对于数组中每个元素a,计算b=x-a,利用二分查找在数组里查找是否存在等于b的元素,用时O(nlgn)。

总用时O(nlgn)。

 

1.linux内存分页分段地址转换.由什么实现

2.linux 命令 tac

3.unix进程分为 进程描述符、数据段、代码段,区分数据段和代码段的目的是?

4.跟淘宝的那道题一样 逆波兰表达式 中序--后序

本帖隐藏的内容

5.找到最近五天的数据并且删除,考的很细 -mtime -exec 还有xarg

6.oooooooooold problem 1000瓶药需要几只狗的问题,不过把狗狗换成小白鼠..

7. 字符串常用匹配算法的复杂度。-->算法导论第32章

8.linux中删除 -- 文件

9.python的注释用# ?

10. av树建树复杂度。

11.满二叉树vs完全二叉树

12.二分查找栈实现需要的最小容量。

13.链表vs数组的优缺点

14.函数指针

15.结构体内存对齐

16. 引用

17.

18.list vector set map

19. 数组指针

20. templete<>问题

21.数组

22.case 缺了break时候的问题
23.类
24.queue可以用那些stl实现?
25.虚函数表在那个阶段完成。
问答:
1.去银行怎么排在用时最短的队里?
2.实时搜索.

 

 

 

 

 

 

公共题也想写写,主要是由我最差的智力题。呵呵,其实智力题很多是需要细心的,诸如逻辑推理之类的题目就不去深究了,毕竟这个是积累啊!

看来,智力题中的数组序列、三个水桶问题最容易考了,好多的类似的题目,

诸如DOS攻击系统漏洞就是纯网络的了:Synflood、Smurf、.Land-based、Ping of Death、Teardrop、PingSweep、Pingflood。

缓冲区溢出攻击向缓冲区发送大量数据,使部分数据溢出到相邻的内存缓冲区,从而破坏缓冲区或者重写逻辑。这样就能够造成拒绝服务、破坏数据或者在远程服务器上执行恶意代码。防止缓冲区溢出攻击的惟一方法是检查所有用户输入的长度。至于输入法漏洞的3389端更是每天听说过快了,什么玩意!

前两条没有写完呢,继续吧!公共题中有考到软件测试方面的知识,涉及测试用例个数,这个需要巩固软件工程的知识了,个人觉得软考软件设计师的书重要的!其实无论是语句覆盖还是条件覆盖。

此外,还考到了oracle中admin下的几个目录:udump,用户转储文件存放位置[存放用户信息];bdump,后台进程的一些调试、日志信息[后台进程和ALRET.LOG文件];cdump,主要是oracle的内核转储记录存放位置[存放系统文件]。

有一个很好的软件,TureCrypt,源磁盘加密软件,免费软件,加密方法不像普通的加密大师什么的,一下子就能破解。WinwebMail、SendMail都是典型的邮件服务器,呵呵,这个不知道哦,可以自己假设这样一个邮件服务器的!

至于使普通用户可执行超级用户文件的就是s权限了,unix-center是个学习unix的好网站哦!chmod +s,创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。当s权限在user的x时,也就是类似 -r-s--x--x,称为Set UID,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者(root)。那么,我们就可以知道,当dmtsai用户执行 /usr/bin/passwd时,它就会“暂时”得到文件拥有者root的权限。

软件测试并不等于程序测试,软件测试应该贯穿整个软件定义与开发整个期间。因此需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应该是软件测试的对象。

OPenAPI我觉得单元测试、安全测试和性能测试至少是要的吧,而验收测试是部署软件之前的最后一个测试操作,其目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。它主要是针对项目型的测试系统,α测试和β测试主要是针对产品型的测试系统,而不能说验收测试包括α测试和β测试,验收测试也是UAT-User
Acceptance Testing
即用户可接收性测试,它是以用户为主的测试。

项目最重要的特性应该是可管理性和可预测性吧。

Web应用安全漏洞最突出的有:Cross Site Scripting、SQL injection等。Cross Site Scripting是一种存在于Web应用中,允许黑客向Web应用注入恶意脚本,以获取其他用户重要数据和隐私信息为母的一种工具形式。

最后一题也得说一说了,有两个有序的整数集合啊,b。请写一个函数,实现找出a,b集合中的交集,并打印出来。这个题倒是不难,我想多了,硬是把第一个数组的值与第二个数组的值循环比较,算法时间复杂确实不敢恭维啊!实际上只需要从左到右比较就ok了。
附录:
一、IPSec协议
      IPSec 协议不是一个单独的协议,它给出了应用于IP层上网络数据安全的一整套体系结构,包括网络认证协议 Authentication Header(AH)、封装安全载荷协议Encapsulating Security Payload(ESP)、密钥管理协议Internet Key Exchange (IKE)和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换,向上提供了访问控制、数据源认证、数据加密等网络安全服务。
     IPSec协议是一个范围广泛、开放的VPN安全协议,工作在OSI模型中的第三层——网络层。
     IPSec协议实际上是一套协议而不是一个单个的协议。
二、隧道技术(Tunneling)
      隧道技术的基本过程是在源局域网与公网的接口处将数据(可以是ISO 七层模型中的数据链路层或网络层数据)作为负载封装在一种可以在公网上传输的数据格式中,在目的局域网与公网的接口处将数据解封装,取出负载。被封装的数据包在互联网上传递时所经过的逻辑路径被称为“隧道”。
  要使数据顺利地被封装、传送及解封装,通信协议是保证的核心。目前VPN隧道协议主要有4种:点到点隧道协议PPTP、第二层隧道协议L2TP、网络层隧道协议IPSec以及SOCKS v5协议。其中,PPTP和L2TP工作在数据链路层,IPSec工作在网络层,SOCK v5工作在会话层。各协议工作在不同层次,我们应该注意,不同的网络环境适合不同的协议,在选择VPN产品时,应该注意选择。
三、SSL和HTTPS
     SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持;SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议提供的服务主要有:认证用户和服务器,确保数据发送到正确的客户机和服务器;加密数据以防止数据中途被窃取;维护数据的完整性,确保数据在传输过程中不被改变。
      https是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。。https是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,https的安全基础是SSL。
四、GnuPG
       电子邮件和数据加密领域,PGP(Pretty Good Privacy)是最为有名的加密工具之一。从9.0版开始,PGP已经发展成为个人计算机数据保护的一个全面的解决方案。你也不一定非要花上大价钱才能保护邮件内容。GnuPG以实际行动证实了它是开源软件中最好的解决方式之一。它能与绝大多数电子邮件客户程序结合,为其提供强大的加密技术。
      GnuPG进行加密要通过叫作公共密钥基础设施(PKI)的简单原理。每个GnuPG用户都拥有由一个公共密钥和一个私有密钥组成的密钥对。使用公共密钥进行加密的电子邮件只能用对应的私有密钥解码。公共密钥及其对应的电子邮件地址集中储存在GnuPG密钥服务器上的数据库中;私有密钥只有它的主人才知道,且在每次使用时都必须输入密码。要想对一条信息进行加密必须从密钥服务器上获得接收人的公共密钥。
五、linux中怎么查找权限位为S的文件
      两种特殊的文件访问权限分别是SUID(八进制为4000)和SGID(八进制为2000)。设置这两种权限的文件,将使其它用户在执行它们时拥有所有者的权限。也就是说,如果一个设置为SUID的程序,即使是普通用户使用也是作为root来运行的。因此,SUID/SGID文件是安全的隐患。
      find / -type f -perm +6000 -ls | less
      find / -type f -perm +6000 > Suid-Sgid.txt
六、软件缺陷生命周期
      软件缺陷是指系统或系统部件中那些导致系统或部件不能实现其功能的缺陷。软件缺陷的起源:需求、构架、设计、编码、测试、用户。对于每一个软件缺陷都规定了6个生命状态:Open、Working、Verify、Cancel、Close、Defer,它们的基本定义是:
        Open态---缺陷初试状态,软件测试员报告一个缺陷,缺陷生命周期开始;
        Working态---缺陷修改状态,程序员接收缺陷,正在修改中;
        Verify态---缺陷验证状态,程序员修改完毕,等待软件测试员验证;
        Close态---缺陷关闭状态,软件测试员确认缺陷被改正,将缺陷关闭;
        Cancel态---缺陷删除状态,软件测试员确认不是缺陷,将缺陷置为删除状态 (不做物理删除);
        Defer态---缺陷延期状态,管理者确认缺陷需要延期修改或追踪,将缺陷置为延期状态;
        上述Open态、Working态、Verify态,称为缺陷的活动态;
        Close态、Cancel态、Defer态,称为缺陷的终结态。
七、项目最重要的特性
        我提一点,根据客户的水平采用不同的过程模型。  
     例如:  
    1、客户如果有一定的项目经验,对计算机比较了解,能给出比较明确的需求,可以采用瀑布模型。  
    2、客户如果对计算机不是太了解,但有过类似项目的经验,并且能积极的给出需求。需求基本正确,可以采用演化式原型开发方法。  
    3、如果客户对计算机能为他做什么没有概念的话。这时就比较适合用废弃式原形开发方法。  
    4、如果客户的主要需求基本稳定,但需求的增长速度和变动频率都比较高,这时就应该用螺旋模型做开发过程模型。

九、两个有序数组求交集的C++实现
#include <stdio.h>
#include <memory.h>
const int M = 5;
const int N = 6;
void intersect(int a[], int b[]) {
     if ((a[M - 1] < b[0]) || (a[0] > b[N - 1]))
        return;
     int n = M > N ? M: N;
     int *p = new int[n];
     memset(p, 0, n);
     int i = 0;
     int j = 0;
     int k = 0;
    while (i < M && j < N) {
         if (a[i] < b[j])
              i++;
         else if (a[i] > b[j])
             j++;
         else {
            p[k] = a[i];
           while (a[++i] == p[k]);
           while (a[++j] == p[k]);
            k++;
        }
   }
   for (i = 0; i < k; i++)
       printf("%4d", p[i]);
   delete [] p;
}
void main() {
     int a[M] = {1, 2, 2, 5, 7};
     int b[N] = {2, 2, 2, 2, 2, 2};
     intersect(a, b); 

 http://blog.sina.com.cn/s/blog_627828e50100fgf8.html

 

 

抱歉!评论已关闭.