网易笔试题

注:试题来源于网络资源,仅供交流、讨论和学习。
**************************************************************
2013年网易暑期实习招聘笔试题目(华中科技大学站):
http://50vip.com/blog.php?i=147

一、选填题
1、假设进栈次序是e1, e2, e3, e4,那可能的出栈次序是()

2、表达式X=A+B*(C-D)/E的后缀表示形式可以是()
   A、XAB+CDE/-*=
   B、XA+BC-DE/*=
   C、XABCD-*E/+=
   D、XABCDE+*/=

3、以下排序算法是非稳定排序的是()
   A、冒泡排序      B、归并排序        C、快速排序         D、堆排序      E、希尔排序

4、一个包含n个结点的四叉树,每一个节点都有4个指向孩子节点的指针,这4n个指针有 (3*n+1)个空指针.

5、请问func(0x7f530829)的返回值是()
1
2
3
4
5
6
7
8
9
10
int  func(unsigned  int  i)
{
     unsigned  int  temp = i;
     temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa)>>1);
     temp = (temp & 0x33333333) + ((temp & 0xcccccccc)>>2);
     temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0)>>4);
     temp = (temp & 0xff00ff) + ((temp & 0xff00ff00)>>8);
     temp = (temp & 0xffff) + ((temp & 0xffff0000)>>16);
     return  temp;
}
   A、15           B、16            C、17           D、18
求数的二进制表示中1的个数的“平行算法”,思路就是先将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。
以217(11011001)为例:
1  1  0  1  1  0  0  1
 \ /    \ /    \  /   \  /
  2      1       1      1
 10    01     01    01
   \      /        \      /
        3              2
    0011         0010
       \                / 
               5
         0000101

6、进程和线程的差别有()
   A、操作系统只调度进程,不调度线程  (进程需要资源调度,线程需要处理机调度)
   B、线程共享内存地址空间,进程不共享      (线程也共享全局变量,常量)
   C、线程可以共享内存数据,但进程不可以
   D、进程间可以通过IPC通信,但线程不可以 (线程之间的通信只有通过读写同一个地址空间的内存来完成)

7、关于段页式管理中,地址映像表是()
   A、每个进程一张段表,一张页表
   B、进程的每个段一张段表,一张页表
   C、每个进程一张段表,每个段一张页表
   D、每个进程一张页表,每个段一张段表

8、关于TCP协议,下面哪种说法是错误的()
    A、TCP关闭连接过程中,两端的socket都会经过TIME_WAIT状态
   B、对一个Established状态的TCP连接,调用shutdown函数可以让主动调用的一方进入半关闭状态
   C、TCP协议默认保证了当TCP的一端发生意外崩溃(当机、网线断开或路由器故障),另一端能自动检测到连接失效
    D、在成功建立连接的TCP上,只有在Established状态才能收发数据,其他状态都不可以。

9、关于主键Primary Key和索引index的说法哪些是错误的?()
   A、唯一索引的列允许为NULL值
   B、一个关系表中的外键必定是另一表中的主键
   C、一个表中只能有一个唯一性索引
   D、索引主要影响查询过程,对数据的插入影响不大

10、数据库的事务隔离级别一般分为4个级别,其中可能发生“不可重复读”的事物级别有()
   A、SERIALIZABLE 
   B、READ COMMITTED
   C、READ UNCOMMITTED
   D、REPEATABLE READ

11、如果F(n)为该数列的第n项,那么这句话可以写成如下形式:
   F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2) (n>=3)
   请实现该函数F(n)的求解,并给出算法复杂度,要求算法复杂度小于O(n^2)。
伪代码:
if(n<2)
return 1;
else
{
f1 = 1;
f2 = 2;
i=2;
while(i
     {
          f = f1+f2;
          f2 = f;
          f1 = f2;
     }
return f;
}
时间复杂度O(n),空间复杂度O(1)。
另:《编程之美》中给出了时间复杂度为O(logn)的方法。

二、编程题
1、题型是考父类子类初始化顺序的。大致是两个很简单的类,子类继承父类,父类有一个public的属性,然后几个sysout语句,最后在main方法中new一个对象,写出sysout的输出顺序。这个初始化顺序包括构造方法,父子类的属性,static属性等,大家这方面看看就懂了,不难。

2、写三个线程,每个线程的id分别是0、1、2,然后写程序,每个线程打印自己的id3次,使得三个线程运行完之后,打印出来的结果是012012012,不能使用sleep方法。

3、异常处理的题目,大致代码如下,问下面的异常处理有什么问题,需要怎么处理?另外问异常处理的一般原则是什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
FileWriter out = ......;
Connection connection = ......;
PreparedStatement statement = ......;
try  {
     ResultSet resultSet = statement.executeQuery( "select name from users" );
     while  (resultSet.next()) {
         out.write(resultSet.getString( "name" ));
     }
     connection.close();
     out.close();
catch  (Exception e) {
     e.printStackTrace();
}

4、有一个 聊天系统,20个房间,每个房间1000人,然后有四~五个问题,大致是针对不同操作的人,根据其操作习惯,比如群发消息比较多,比如增删好友比较多等等条件,然后选择一个最适合的集合类来存储这些用户。详细的不记得了(另外,面试的时候也问到聊天系统,感觉网易应该想在这方面开发东西,问了我socket和nio的东西,大家可以准备一下。)
根据情况选择适当的集合类(容器类):说有10个聊天室,每个聊天室1000人,问根据情况应该选择神马样的 容器(集合)?
(1) 经常顺序地向群中的人发送通知信息;
(2) 经常添加人,而且要保证名字的有序;
(3) 经常加人,经常踢人,保证按添加的先后有序;
(4) 经常查找某个人是否在聊天室中;

5、分析JVM对内存的管理以及和垃圾回收器之间的关系。

**************************************************************
网易2013校园招聘笔试题详解:
http://blog.csdn.net/silangquan/article/details/18142651

第一部分:同上
第二部分(必做):程序设计(25分)
1.(2分)下面的程序的输出是什么?
#include  
int main()  
{  
       int n;  
       char y[10] = “ntse”;  
       char*x = y;  
       n= strlen(x);  
       *x= x[n];  
       x++;  
       printf(“x=%s\n”,x);  
       printf(“y=%s\n”,y);  
}  
简单:
x=tse
y=

2.(2分)请给出下面程序的输出结果,并说明原因。
#include  
#include  
using namespace std;  
template  
class array{  
       public:  
              array(int size);  
              size_t getVectorSize() {return _data.size();}  
              size_t getSize() {return _size;}  
       private:  
              vector  _data;  
              size_t  _size;  
};  
template  
array::array(int size):_size(size),_data(_size)  
{ }  
   
int main()  
{  
       array*arr= new array(3);  
       cout<getVectorSize()<
       cout<getSize()<
       return 0;  
}  
0
3
解析:主要考察构造函数列表,看上去首先是_size赋值为3,然后用_size作为参数构造vector.BUT!
类成员的初始化顺序是和成员在类中的声明顺序一致的!所以_data是在_size之前就初始化好了,调用的默认构造函数,所以里面没有元素。
编译器:gcc4.7

3.(2分)CAS(CompareAndSwap),是用来实现lock-free编程的重要手段之一,多数处理器都支持这一原子操作,其用伪代码描述如下:
template bool CAS(T* addr, T expected, Tvalue)  
{  
       if(*addr== expected){  
              *addr= value;  
              return true;  
       }  
       return false;  
}  
请完成下面填空,实现全局计数器的原子递增操作。
int count = 0;  
void count_atomic_inc(int *addr)  
{  
       int oldval = 0;  
       int newval = 0;  
       do{  
              oldval= *addr;  
              newval=          + 1;  
       }until CAS(       ,       ,       )  
}  
1)oldval 2)addr,oldval,newval

4.(2分)下面的程序会输出几个“-”?
#include  
#include  
#include  
int main(void)  
{  
       int i;  
       for(i=0;i<2;i++){  
              fork();  
              printf(“-”);  
              fflush(stdout);  
          }  
       return 0;  
}  
6
使用printf()函数后,内容存入输出缓冲区。通常,如果有'\n'时,才进行一次输出,或者,等到时间片轮转到系统的输出程序时,才将其输出。在printf()函数后使用fflush( stdout )函数, 先将即将输出的内容输出,然后,再将输出缓冲区清空。

5.(4分)写程序判断当前CPU是大端CPU还是小端CPU,并做简要说明。
最简单的方式就是 利用union的特性,由于联合的大小和最大成员的大小一样,里面的成员是共享存储空间的。
int checkCPU( ){  
    union w {  
    int a;  
    char b;  
    } c;  
    c.a = 1;  
    return(c.b ==1);  
}  
大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,
小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian,ARM则同时支持 big和little,网络编程中,TCP/IP统一采用大端方式传送数据,所以有时我们也会把大端方式称之为网络字节序。
C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而 JAVA编写的程序则唯一采用big endian方式来存储数据。

6.(5分)利用位运算实现两个整数的加法运算,请代码实现,并做简要说明。
int Add(int a, int b)  
{  
    int sum = a ^ b;  
    int carry = a & b;  
    while (carry != 0) {  
        a = sum;  
        b = carry << 1;  
        sum = a ^ b;  
        carry = a & b;  
    }  
    return sum;  
}  

7.(8分)图深度遍历问题
网易笔试题_第1张图片
a) 写出上述图的深度优先遍历的顺序(遍历起点是节点1)   12485367
解析:深度遍历思想
(1)访问初始顶点v并标记顶点v已访问。
(2)查找顶点v的第一个邻接顶点w。
(3)若顶点v的邻接顶点w存在,则继续执行;否则回溯到v,再找v的另外一个未访问过的邻接点。
(4)若顶点w尚未被访问,则访问顶点w并标记顶点w为已访问。
(5)继续查找顶点w的下一个邻接顶点wi,如果v取值wi转到步骤(3)。直到连通图中所有顶点全部访问过为止。

b) 若用邻接矩阵Matrix存储该矩阵,写出该矩阵
c) 若用非递归方式实现深度优先遍历,请叙述大致的实现思想
用一个顺序栈来记录访问过的顶点。
d) 用你熟悉的任何语言实现非递归深度优先遍历
  1. void DFS( int v)    
  2. {    
  3.     cout << " v"<< v ;    
  4.     int top = -1 ;    
  5.     visited[v] = true ;    
  6.     stack[++top] = v ;    
  7.     while ( top != -1)    
  8.     {    
  9.         v = stack[top] ;    
  10.         for (int i = 0 ; i < MAX_NODE ; i++)    
  11.         {    
  12.             if (Matric[v][i] == 1 &&!visited[i])    
  13.             {    
  14.                 cout << " v" << i ;    
  15.                 visited[i] = true ;    
  16.                 stack[ ++top ] = i ;    
  17.                 break ;    
  18.             }    
  19.         }    
  20.         if( i == MAX_NODE)    
  21.         {    
  22.             top -- ;    
  23.         }    
  24.     }    
  25. }  

第三部分(选做):C++开发工程师必做,其他选做(15分)
1.(6分)给定一个巨大的文本文件,写一个程序随机输出文件任意k行(k不大,k行能放入内存),要求每一行出现概率相等,请给出核心算法,算法复杂度以及简要的算法原理说明。

蓄水池算法:http://www.cnblogs.com/afarmer/archive/2013/03/30/2991059.html
1)在不知道文件总行数的情况下,如何从文件中随机的抽取一行?
定义取出的行号为choice,第一次直接以第一行作为取出行 choice ,而后第二次以二分之一概率决定是否用第二行替换 choice ,第三次以三分之一的概率决定是否以第三行替换 choice ……,以此类推。
这种方法的巧妙之处在于成功的构造出了一种方式使得最后可以证明(用归纳法)对每一行的取出概率都为1/n(其中n为当前扫描到的文件行数),换句话说对每一行取出的概率均相等,也即完成了随机的选取。
2)如何从未知或者很大样本空间随机地取k个数?
类比下即可得到答案,即先把前k个数放入蓄水池,对第k+1,我们以k/(k+1)概率决定是否要把它换入蓄水池, 换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。

2.(9分)Spin Lock是一种较为常见与使用的互斥方法,下面是一种其实现方式:
typedef int lock_t  
void initlock(void volatile lock_t*lock_status){  
       *lock_status= 0;  
}  
   
void lock(void volatile lock_t* lock_status){  
       while(test_and_set(lock_status)== 1);  
}  
   
void unlock(void volatile lock_t*lock_status){  
       *lock_status= 0;  
}  
a) volatile关键字的作用
volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错。
b) 怎样优化lock函数(提示:多CPU下如何提高CPUCache效率)
c) 上述代码可能存在的问题(内存模型考虑)
参考 spinlock剖析与改进

第四部分(选做):客户端安全工程师必做,其他选做
1. 请简述使用互斥量(Mutex)和临界区(CriticalSection)作为同步方法的区别及应用场景。
2. 如何让一个循环执行的线程安全退出,请用C++代码实现相应线程函数及退出机制。
3. 请列举可以用来唯一标识一台机器特征的属性有哪些;在某些机器特征可能被更换的情况下,请设计一套方案用来唯一标识这台机器。
4. 请描述利用CreatProcess注入一个dll到新创建进程的过程,必要部分可以写伪代码。
5. 请列举32位系统下,驱动隐藏进程的常用方法。
6. 如何检测当前程序运行在虚拟机环境下。
说明:虚拟机主要是指目前常见的VMWare,Virtual PC,Virtual Box等;可以对一种虚拟机检测,也可以对多种虚拟机检测进行说明。

第五部分(选做):客户端开发工程师必做,其他选做
1. WM_QUIT消息的用途是什么?一个普通的windows窗口能收到的最后一条消息是什么?
2. 什么是DLL的延迟加载(DelayLoad)?用延迟加载有什么好处?
3. 并行计算(ParallelComputing)与并发计算(Concurrent Computing)的联系与区别是什么?
4. 堆内存(Heap)和栈内存(Stack)的联系和区别是什么?在编码过程中,何时优先使用堆内存,何时优先使用栈内存?
5. 为什么windows下有些文件被删除后还能通过一些数据恢复软件将其数据恢复?

**************************************************************
2013网易技术类笔试题( java开发方向+移动平台开发):
http://blog.csdn.net/kavensu/article/details/8058155

第一部分:计算机基础(选择题都是多选题)
1-5. 同上上一样。

第二部分:程序设计
这些题目有些是读程序的,我记不住那么多。考了很多操作系统方面的,java的多线程、IO操作、集合框架是重点呀。
1、网易的邮箱有@126.com、@163.com、@yeah.net 。用户名长度6~18,以字母开头,不区分大小写,其他可以是任意字母或数字。以下正则表达式哪个能正确检查账号的正确性。
选项记不清。但是不难,大家应该也可以写出来。
自己写的,不知道对不对
^[A-Za-z][A-Za-z0-9]{5,17}@([(126)|(163)].com|yeah.net)$
^\w+ [A-Za-z0-9]{5,17}@([(126)|(163)].com|yeah.net)$

2、以下程序输出什么?
    byte a = 5;  
    int b = 10;  
    int c = a>>2+b>>2;  
    System.out.println(c);  
结果是0

3、说说HashMap和TreeMap的区别? 还有不是很记得是哪两个类的区别了,反正也是集合框架里面的。

**************************************************************
 2014-04-17-网易有道研发类笔试题:
http://blog.csdn.net/candy_578079476/article/details/24291939

一、填空&选择
1、选择:给了一个递归求Fibonacci的代码,问算法复杂度

2、选择:忘记了,应该不难

3、选择:给你52张除掉大小王的扑克,任意抽取8张,求和,问下列哪个答案的概率最大
选最接近平均数的答案,忘了题目是扑克牌(1-13)还是筛子(1-6)
扑克的话选最接近((1+13)/2)*8 = 56;筛子的话选最接近((1+6)/2)*8 = 28

4、填空:著名的蒲丰投针概率问题,在一个平面上有无线条间距为H的平行线,一根针长度为h(H>h),投掷这根针,使之落在平面上,问,针与线有交点的概率
2h/πH,证明见布丰投针几何证明

5、填空:一棵树,n1个节点度为1,n2个节点度为2,...,nk个节点度为k,求叶子节点个数
网易笔试题_第2张图片
参考二叉树的 证明方法
叶子是度为0的节点,数目为n0
节点总数:n = n0+n1+n2+...+nk
分支树:B = n1 + 2*n2 +3*n3+...k*nk
除了根节点,其他节点都是由分支而来:n = B + 1

6、选择:指针跟引用的用法问题

7、选择:C++和Java中虚函数的区别

8、填空:给了一段递归代码的函数(关键代码是x(n) = x(n)+x(n-1)+x(n-2)),求算法复杂度
3^n

9、填空:a,b,c,三个数均匀分布在(0,1)之间,求a+b+c之和在(0,1)的概率
1/6
方法一:三重积分
方法二:几何证明,a+b+c=1表示一个平面,a,b,c在(0,1)之间表示一个正方体

10、填空:三个人按顺序射击比赛,各自有各自的概率命中(已知的概率),有人命中比赛即结束,问第三个人获胜的概率

二、编程题
1、实现两个整数的求和,整数存在单链表之中,整数的高位数字存在头结点,以此类推,返回一个链表
方法一:借助两个辅助栈,再从最低位算起
方法二:先翻转链表,再从最低位算起
方法三:从高位做,递归

2、实现next_permutation的函数,即下一字典序列,输入输出都是string。
问题:求给定数组不按升序排列的最小字典序列
思路:将数组排序(升序),然后从尾到头找到第一个可以交换的位置(因为可能有重复的数字)。

3、给一个矩阵A(5*5),一个整数n,求A^n的每个元素模13的值,返回一个5*5矩阵

**************************************************************
2014.03.16 网易游戏TTT计划实习生笔试题:
http://blog.csdn.net/jnu_simba/article/details/21534059

前面这些题是试卷的第I部分,试卷上面说第一部分达不到基本线直接淘汰,最终排名主要看II卷
I 卷 基础题
1.求1111+2*1111+....+1111*1111对7求余的结果。
即556*1111*1111对7求余,每个数分别对7求余,余数相乘后对7求余最后算的结果是 5.

2.某点p(x,y,z),绕Y轴旋转的角度为 ,求三维旋转矩阵。
坐标旋转的问题用向量的方法比较容易做,p点对应的是x*i+y*j+z*k,ijk为各自的单位向量,看成矢量相加,分别旋转各个矢量!

3.如下图,A, B, C, D, E灯泡坏掉的概率分别为0.2, 0.3, 0.4, 0.5,0.6,求此电路不通的概率
  网易笔试题_第3张图片
AB路坏的概率:0.2*0.7 + 0.8*0.3 + 0.2*0.3 = 0.44
CDE路坏的概率:0.4*0.5 + 0.6 – 0.4*0.5*0.6 = 0.68
总的概率 0.44 * 0.68 =0.2992

4.f(0)=0,f(1)=1,f(n)=(f(n-1)+f(n-2))mod5  求f(2013);
周期为20,f(2013)=f(13)=3

5.二分查找的时间复杂度 O(logn),堆排序的空间复杂度O(1)。快排的时间复杂度 O(nlogn)

6.堆和栈的区别。

7.下面代码的输出结果:(其实这种题比较坑爹)
#define mul(a) (a)*(a)
int main( void)
{
     int a =  5, b, c;
    b = mul(a++);
    c = mul(++a);
     if(!a && c++)
        b++;
     else
        c++;
    printf( "%d %d", b, c);
}
答案:25 82
自增运算符优先级高于乘除

8.定义一个宏,若满足条件则终止程序并报告错误文件名和行数, 并有以下调用
    if(x>=0 && y>=0)
       assert(x+y);
    else
       assert(x-y);
如果按照以下格式写宏,会有什么问题:
#define assert(e) if(!e) assert_error(__FILE__, __LINE__)
//边际效应,会变成!x + y,而且原来的else会跟这里的if(!e)匹配

如果按照以下格式写,又会有什么问题:
#define assert(e) {if(!e) assert_error(__FILE__, __LINE__);}
//错误仍在且出现语法错误,编译错误,花括号外面多了个分号

怎样改才是对的?#define assert(e);   {if(!(e)) assert_error(__FILE__, __LINE__);}  ( 用代码块
或者  #define assert(e) ((e) || assert_error(__FILE__, __LINE__);) 或不用if

*************************************************
插入:C语言之断言( http://blog.csdn.net/wxq1987525/article/details/6639220)
原型():
void assert( int expression );
其作用是先计算表达式 expression , 如果expression的值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。使用断言能够很快定位出错点。
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。所以在调试结束后,可以通过在包含#include 的语句之前插入  #define NDEBUG 来禁用assert调用。
定义自己的断言,更具灵活性:( 注意细节:\、assert_report、相关宏、while(0)
#define  ASSERT_REPORT( condition )       \
 do{       \
 if ( condition )       \
  NULL;        \
 else         \
  assert_report( __FILE__, __func__, __LINE__ ); \
 }while(0)
上面的题目答案写成这个形式更好!
再看一下源码:
VS里的:
#ifdef   NDEBUG
#define  assert(_Expression)     (( void )0)
#else
#ifdef   __cplusplus
extern  "C"  {
#endif
_CRTIMP  void  __cdecl  _wassert(_In_z_  const  wchar_t  * _Message, _In_z_  const  wchar_t  *_File, _In_  unsigned  _Line);
#ifdef   __cplusplus
}
#endif
#define  assert(_Expression) ( void  )( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
#endif    /* NDEBUG */
*************************************************

10.已知是低端保存,32位机器,求输出结果.答案应该是8 2
struct data
{
     int a;
     unsigned short b;
};
int main( void)
{
    data mData;
    mData.b = 0x0102;
     char *p = ( char *)&mData;
    printf( "%d %d"sizeof(mData), ( int) (*(p +  4)));
}
Debug模式下:
               mData.a = 0x12345678;
               mData.b = 0x0102;
内存结果为:
(低地址)78 56 34 12 02 01 cc cc(高地址)

11.下面程序输出是什么?  ~Base
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
#include 
using  namespace std;
class Base
{
public:
    ~Base()
    {
        cout <<  "~Base" << endl;
    }
};
class Dri:  public Base
{
public:
    ~Dri()
    {
        cout <<  "~Dri" << endl;
    }
};
int main()
{
    Base *b =  new Dri();
     delete b;
     return  0;
}
这道题说明了为什么通常将析构函数声明为虚函数。

12.下面调用fork()总共生成多少个进程,打印几个'-'   4  6 (注:如果没有fflush,将输出8个'-')
1
2
3
4
5
6
7
8
9
10
11
12
13
 
#include 
#include 
int main()
{
     int i;
     for(i =  0; i <  2; ++i)
    {
        fork();
        printf( "-");
        fflush(stdout);
    }
     return  0;
}
使用printf()函数后,内容存入输出缓冲区。通常,如果有'\n'时,才进行一次输出,或者,等到时间片轮转到系统的输出程序时,才将其输出。在printf()函数后使用fflush( stdout )函数, 先将即将输出的内容输出,然后,再将输出缓冲区清空。

13.此代码有什么用?./a.out >outfile 2>&1
将a.out程序运行的标准输出和标准错误输出重定向到outfile。

12.一分钟的音乐,采用14400的采样率,双声道,每个点16bit,问音乐的大小。14400*2*16*60/8=3456000B

II卷 程序应用与设计
1.程序改错 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 

class obj
{
public:
    obj()
    {
        m =  0;
        data =  new  int[ 100];
    }
    obj( const &t)
    {
        m = t.m;
        data =  new  int[ 100];
        memcpy(( char *)data, ( char *)t.data,  sizeof( int) *  100);
    }
     int squ( volatile  int *p)  //表示对*p的赋值,将全部保留不做优化,volatile摆放的位置不同导致的不同含义与const类似
    {
         int tmp = *p;
         return tmp * tmp;
    }
    ~obj()
    {
         if(data)
             delete[] data;
    }
     void add()
    {
        m++;
    }
private:
     int m;
     int *data;
};
int main()
{
    obj o1;
    obj o2 = o1;
     return  0;
}

2.两个题可以选一个。
a.写一个strcmp函数
int  strcmp( const   char  *s,  const   char  *t)
{
    assert(s !=  NULL  && t !=  NULL );
     while (*s && *t && *s == *t)  //利用'\0'=0x00
    {
        ++ s;
        ++ t;
    }
     return  (*s - *t);
}

b.约瑟夫环的问题。

3.纸牌游戏,随便抽五张牌,A代表1,2-10还是2-10,J,Q,K表示11,12,13, 大小王可以当任何一张。判断5张牌是不是顺子。
不难。

4.写一个内存管理存储器,已知学生的学籍id,姓名,性别,省份,个性签名等信息。
要求:用C++;Linux环境下;至少建立两个索引加快查询;线程安全;高效的增删改查。

5. 一段关于redis KEYS 命令英文简介,说明使用KEYS这个命令会导致什么问题和有什么解决方法。

**************************************************************
 网易游戏2011.10.15校园招聘会笔试题:
http://blog.csdn.net/hackbuteer1/article/details/6878570
http://www.cnblogs.com/jerry19880126/archive/2012/08/07/2626982.html

1、对于一个内存地址是32位、内存页是8K B的系统。0X0005F123这个地址的页号与页内偏移分别是多少?
内存划分的基本单位是字节页号47,偏移0x1123

2、如果X大于0并小于65536,用移位法计算X乘以255的值为?
(X<<8)-X 这里的括号不能少, 因为移位运算符的优先级较低。

3、一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有   3n+1  个空指针

4、以下两个语句的区别是:
int *p1 = new int[10];   //int指针,指向数组首地址,未初始化
int *p2 = new int[10]();   // 全部初始化为0,new两个步骤……,从反汇编来看,这里第二步: call        @ILT+130(_memset) (10A1087h)  
 
5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式:      小端模式:     X86结构的计算机使用     模式
大端模式: 0x12
小端模式: 0x56(低位保存在低地址)
x86使用 小端模式。 

6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:
int (*fp)(int *);
 
7、下面程序运行后的结果为:
    char  str[] =  "glad to test something"  ;
     char  *p = str;
    p++;
     int  *p1 =  static_cast  < int  *>(p);
    p1++;
    p =  static_cast < char  *>(p1);
    printf(  "result is %s\n" ,p);  
结果: to test something 
编译不通过,VS和g++上都不通过,static_cast:隐式转换。

8、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:
(1)恰好第K次(1=
(2)平均需要尝试多少次。
网易笔试题_第4张图片

9、头文件中ifndef / define / endif 是做什么用的?
防止重复包含 (预编译阶段)

10、代码里有时可以看到extern “C”,这语句是做什么用的? 
强调用C编译器来编译代码,实现C++与C及其它语言的混合编程。

******************************** 
两种用法:
一是 在C++中引用C语言中的函数和变量在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern "C"
{
#include "cExample.h"
}
二是 在C中引用C++语言中的函数和变量时, C++的头文件需添加extern "C":
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
******************************** 

11、平均要取多少个(0,1)中的随机数才能让和超过1。 
网易笔试题_第5张图片

12、在下列乘法算式中,每个字母代表0~9的一个数字,而且不同的字母代表不同的数字:

 ABCDEFGH
*           AJ
------------------
EJAHFDGKC
BDFHAJEC
------------------
CCCCCCCCC
请写出推导的过程。

第一步能推出来的是K=0。第二步看到A*A=B,没有进位,因此A只能取0,1,2,3,0已经分给K了,而若A取1,则乘出来的结果应该很特殊,所以只能取2或3。假设A取3,则要求前一项AB的乘积不能有进位,但A*A=9,B=9,A*B=27,一定会出现进位,这样就矛盾了,A只能取2。第三步看A*A的进位是E,A是2,2*2=4,进位是来自前一项的,前一项进位最多是7(最大数乘8*9=72),所以E只能取1。第四步把G推出来,乘法中有A*G=E的项,而A为2,E为1,E是奇数,说明有来自前一位的进位(这个进位最大只能是1,因为A只有2),G只有取5。第五步把B推出来,注意加法中有两项E+B=C和G+E=C,都能得到C,而加法进位最多为1,所以推出G与B相差一位,K+C是不可能有进位的(因为K=0),这样B就比G小1,所以B为4。第六步终于可以把C推出来了,G和E知道,而前一项加法不可能有进位,所以C一定是6。第七步可以推H了,2*H=6,H可以取3或8,假设H取3,则J*H=C项要求J只取2,与A=2矛盾,所以H只能取2。第八步顺便把J推出来了,J不能取2了,只能取7。第九步把剩下的F解决了,已经推出很多项了,F硬算也能算出来为3。第十步不用说,D=9,再检查一遍,都满足条件。
 
13、输入格式:第一行输入N(N<=100)表示流通的纸币面额数量;第二行N个纸币的具体表示的面额,从小到大排列,取值【1,10^6】。
输出格式:输出一个整数,表示应该发行的纸币面额,这个整数是已经发行的所有纸币面额都无法表示的最小整数。(已经发行的每个纸币面额最多只能使用一次)
输入                             输出
5
1 2 3 9 100                    7

5
1 2 4 9 100                    8

5
1 2 4 7 100                    15

网友提出母函数的解法:构造母函数(1+x)(1+x^2)(1+x^3)(1+x^9)(1+x^100),将其乘开来,看看x的幂缺哪些,第一个缺的即为所求。
我的解法:将问题表述转化为:求能表示的最大连续整数,并用减治法来求,
代码:
int  cash( int  n, int  a[])
{
                  int  max = 0;
                  for ( int  i=0; i
                {
                                  if (a[i]>max+1)
                                                  return  (max+1);
                                  else
                                                max +=a[i];
                }
                  return  (max+1);
}

**************************************************************
04年网易华工的笔试题目:
http://blog.csdn.net/tvtvtvtv/article/details/1404054

3.new/delete和malloc/free的区别,并说说你在什么情况下会自另行建立自己的内存分配机制。
回答一下 为什么有必要写自己的operator new和operator delete?
为了效率。缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能。尤其在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此。
有这样一个方法来实现你的自定义的operator new:先让缺省operator new分配一些大块的原始内存,每块的大小都足以容纳很多个airplane对象。

6.编程题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
解法:
1)维持一个 队列从1开始入队列并记录和sum,直至x入队时sum>=n
2)此后sum等于n则输出队列,大于则队列弹出一个元素,然后x+1入队,小于则继续入队
3)直到x==[(n+2)/2]
复杂度O(n),实现时可以用首末变量代替队列,
代码:表示成至少两个之和的版本
void  sum( int  n)
{
     int  first = 1;
     int  end = 2;
     int  sum = first + end;
                  int  fin = (n+1)/2;
     while (end<=fin)
    {
        if (sum < n)
       {
           end++;
           sum += end;
       }
        else  if  (sum > n)
       {
           sum -= first;
           first++;
       }
        else
       {
            for ( int  i = first; i <= end; i++)
              cout << i <<  " " ;
           cout << endl;
           sum -= first;
           first++;        
       }
    }
}

7.有两个字符串 str1和str2,写一个函数实现在str1中查找str2的初始位置。要求不区分大小写。

8.在字符串S中寻找最长的字符串x,条件是x存在于S中。即是如:abcabcdcd中的abc。 

9.求Fibonacci数列中第k个与前面所有数互质的数(除前面两个数 1,1 )( 称为Fibonacci质数)。 
常规解法,蛮力:
1)矩阵法求斐波那契数列第n项
2)欧几里得解法求两数最大公约数,判断是否互质
3)遍历

更高效的,运用定理(跪了,一般人不知道):

所以只有当(n,m)=1或2,m=1,2,3……,n-1时F(n)为斐波那契质数。

10.有100个真币和一个假币,只知道真币与假币不等重,要求只称两次,得出是真币重还是假币重。
简单题

15.程序设计题:给出若干个单词,组成字典,要求查找速度最快。 
使用小写字母a-z组成单词,用1表示a,一直到26表示z.使用幂乘法表示字母,比如ab为a*26+b( 仿照进制表示),然后用幂乘法算出来的数字对数组大小的两倍值取余得到哈希值.用字母组合aa表示被删除的单词.

我想到的是字典树,因为题目没有要求空间复杂度。

21.有一位警长,抓了三个逃犯。现警长决定给他们一次机会。他拿出3顶黑帽子,两顶白帽子,然后往这三个逃犯头上每人戴了一顶帽子,每个逃犯只能看到另外两个逃犯帽子的颜色,不能看到自己帽子的颜色,而且不能进行通讯,不能进行讨论,只能靠自己的推理推出来,如果猜出来了,放一条生路,否则处死。
警长先问第一逃犯,结果第一逃犯猜错了,被杀掉了。
警长问第二个逃犯,结果还是猜错了,同样被杀掉了。
警长再问第三个逃犯,结果第三个逃犯猜对了。
说明一下,每个逃犯在回答问题时,其他逃犯是听不到的。
为什么第三个一定能猜中,请你给出解释。

简单题。三个逃犯依次编号ABC,A猜错,说明BC不全为白,即有一个人戴的是黑帽子;B又猜错,说明C戴的一定不是白帽子,否则他可以猜到自己戴的是黑帽子;所以C可以确定自己戴的一定是黑帽子。
***************************
插入: 黑白帽子问题
一群人开舞会,每人头上都戴着一顶帽子。帽子只有黑白两种,黑的至少有一顶。
每个人都能看到其它人帽子的颜色,却看不到自己的。
主持人先让大家看看别人头上戴的是什么帽子,然后关灯,如果有人认为自己戴的是黑帽子,就打自己一个耳光。
第一次关灯,没有声音。
于是再开灯,大家再看一遍,关灯时仍然鸦雀无声。
一直到第三次关灯,才有劈劈啪啪打耳光的声音响起。
-----------------------问有多少人戴着黑帽子?

答案也比较简单,到了第几次动手,就可以知道有几个戴了黑帽子。
***************************

**************************************************************
09网易校园招聘笔试题:
http://blog.csdn.net/liuzhanchen1987/article/details/7902487

A卷(研发类笔试题)
第一部分(必做): 计算机科学基础
1. (单选)软件设计中模块划分应该遵循的准则是:
    A.低内聚低耦合  B.高内聚低耦合 C.低内聚高耦合 D.高内聚高耦合

2. (单选)最坏情况下时间复杂度不是n(n-1)/2的排序算法是:
    A.快速排序 B.冒泡排序 C.直接插入排序  D.堆排序

3. 哈希表中解决冲突的方法通常可以分为open addressing和chaining两类, 请分别解释这两类冲突解决方法的大致实现原理

4. 简单的链表结构拥有很好的插入 删除节点性能, 但随机定位(获取链表第n个节点)操作性能不佳, 请你设计一种改进型的链表结构优化随机定位操作的性能, 给出设计思路及其改进后随机定位操作的时间复杂度。
建立索引,利用指针数组存储链表结构的指针。

5. 什么是 NP问题?列举典型的NP问题(至少两个)?对于一个给定的问题你通常如何判断它是否为NP问题?

6. 以下是一个tree的遍历算法, queue是FIFO队列, 请参考下面的tree, 选择正确的输出.
1
/ \
2   3
/ \ / \
4 5 6 7
queue.push(tree.root){
while(true){
node=queue.pop();
output(node.value);//输出节点对应数字
if(null==node)
   break;
for(child_node in node.children){
   queue.push(child_node);
}
}
A. 1234567
B. 1245367
C. 1376254
D. 1327654

第二部分(选作): C/C++程序设计
1. 有三个类A B C定义如下, 请确定sizeof(A) sizeof(B) sizeof(C)的大小顺序, 并给出理由.
struct  A{
A() {}
~A() {}
int  m1;
int  m2;
};

struct  B{
B() {}
~B() {}
int  m1;
char  m2;
static  char  m3;
};

struct  C{
C() {}
virtual ~C() {}
int  m1;
short  m2;
};
sizeof(A) sizeof(B) sizeof(C)结果分别为  8 8 12 ,注意C中的虚函数。 

2. 请用C++实现以下print函数,打印链表I中的所有元素, 每个元素单独成一行
void print(const std::list &I){
                  for (list< int  >::const_iterator it = I.begin(); it!=I.end(); it++)
                {
                                cout<<*it<
                }
}
这里一定要注意I是const引用类型,所以一定要用 : const_iterator ,否则编译不通过。

3. 假设某C工程包含a.c和b.c两个文件,在a.c中定义了一个全局变量foo, 在b.c中想访问这一变量时该怎么做?
extern。

4. C++中的new操作符通常完成两个工作, 分配内存及其调用相应的构造函数初始化
请问:
1) 如何让new操作符不分配内存, 只调用构造函数?
2) 这样的用法有什么用?

  1. classname *f=new((void*)10)classname();  
  2. 作用是:将对象放置在内存的特殊位置,是在已有的内存块上面创建对象。  
  3. 用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗  

    A* p = (A*)::  operator  new  ( sizeof (A));   //记得那里说new内置sizeof操作的,这里是直接调用全局函数(不用忘了::符号)
     new (p) A(); 

5. 下面这段程序的输出是什么?为什么?
class A{
public:
A(){p();}
virtual void p(){print("A")}
virtual ~A(){p();}
};
class B{
public:
B(){p();}
void p(){print("B")}
~B(){p();}
};
int main(int, char**){
A* a=new B();
delete a;
}
  1. 语法错误!对象B不能实例化A  

6. 什么是C++ Traits? 并举例说明
类型和类型的特性本是耦合在一起,通过traits技巧就可以将两者解耦。
好好学习STL源码。

第三部分(选作): JAVA程序设计
1. (单选)以下Java程序运行的结构是:
public class Tester{
public static void main(String[] args){
   Integer var1=new Integer(1);
   Integer var2=var1;
   doSomething(var2);
   System.out.print(var1.intValue());
   System.out.print(var1==var2);
}

public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
A. 1true
B. 2true
C. 1false
D. 2false
2. (单选)往OuterClass类的代码段中插入内部类声明, 哪一个是正确的:
public class OuterClass{
private float f=1.0f;
//插入代码到这里
}
A.
class InnerClass{
public static float func(){return f;}
}
B.
abstract class InnerClass{
public abstract float func(){}
}
C.
static class InnerClass{
protected static float func(){return f;}
}
D.
public class InnerClass{
static static float func(){return f;}
}
3. Java中的interface有什么作用? 举例说明哪些情况适合用interface, 哪些情况下适合用抽象类.
4. Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
5. 线程安全的Map在JDK 1.5及其更高版本环境 有哪几种方法可以实现?
6. 
1) 简述Java ClassLoader的模型, 说明其层次关系及其类加载的主要流程即可.
2) TypeA.class位于classpath下, /absolute_path/TypeA.class为其在文件系统中的绝对路径, 且类文件小于1k, MyClassLoader为一个自定义的类加载器, 下面的这段类加载程序是否正确, 如果有错请指出哪一行有错, 简述理由
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class Tester{
public static void main(String[] args){
   MyClassLoader cl1=new MyClassLoader();
   try{
    File f=new File("/absolute_path/TypeA.class");
    byte[] b=new byte[1024];
    InputStream is=new FileInputStream(f);
    int I=is.read(b);
    Class c=cl1.defineMyClass(null,b,0,1);
    TypeA a=(TypeA)c.newInstance();
   }catch(Exception e){
    e.printStacktrace();
   }
}
}

第四部分(选作): Linux应用与开发
1. 写出完成以下功能的Linux命令:
1) 在当前目录及其子目录所有的.cpp文件中查找字符串"example", 不区分大小写;
find . -name "*.cpp" -type f | xargs grep -i "example"
**********************************
插入:
find命令:
-name   filename             #查找名为filename的文件
-user    username             #按文件属主来查找
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-print 将查找到的文件输出到标准输出
如:
$find  .  -size  100c   -print # 查长度大于100c的文件;
$find  .  -size  +10  #查长度超过10块的文件(1块=512字节))
$find   . -type d   -print

xargs命令:
xargs是给命令传递参数的一个过滤器,也是 组合多个命令的一个工具
与管道不同的是:管道是实现“将前面的标准输出作为后面的标准输入”,xargs是实现“将标准输入 作为命令的参数
如:
echo "--help"|cat   #显示 --help
echo "--help"|xargs cat  #执行 cat --help

grep命令:
grep ‘test’ d*  #显示所有以d开头的文件中包含 test的行。
grep ‘test’ aa bb  #显示在aa,bb文件中匹配test的行。
grep -i "main" ./test1.c  # -i不区分大小写

2) 使用sed命令, 将文件xyz中的单词AAA全部替换为BBB;
sed 's/AAA/BBB/g' xyz
补充:sed 编辑器逐行处理输入,然后把结果发送到屏幕。

3) 用一条命令创建aa bb cc三个子目录
mkdir aa bb cc
补充:
rm -r  #递归删除目录及其文件
rm -d  #删除空目录

4) mount cdrom.iso至/dev/cdrom目录
     mount -o loop cdrom.iso /dev/cdrom
    其命令格式为:mount [-t vfstype] [-o options] device dir
    1.-t vfstype 指定文件系统的类型,通常不必指定,mount 会自动选择正确的类型。
    2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有: 
    loop:用来把一个文件当成硬盘分区挂接上系统(挂载iso文件时不加会提示“matu2k9a.iso is not a block device”) 
    ro,rw:采用只读或读写方式挂接设备 
    iocharset:指定访问文件系统所用字符集 
    auto:允许此分区被以mount -a自动挂载
    remount:重新挂载,在系统出错或更新参数时很有用

5) 设置ulimit使得程序在Segment fault等严重错误时可以产生coredump;

2. 设umask为002, 则新建立的文件的权限是什么?
A. -rw-rwr--
B. rwxrwx-w-
C. -------w-
D. rwxrwxr-x
 -rw-rw-r--
*************************
umask:
当建立一个新的文件或目录时,其默认属性,为掩码。

[root@linux ~]# umask   #查看umask值
0022                            #第一个数字表示特岁权限,不用管
[root@linux ~]# umask -S   #以符号方式显示权限
u=rwx,g=rx,o=rx

每个数字表示r、w、x权限由高到低组成的二进制数的十进制值;
三个数字分别表示当前用户,同组用户,其他组用户的权限。

文件: 
文件一般为数据记录,不需要执行(x)权限, 即  -rw-rw-rw-,最大为666。
目录:
目录的x权限表示用户能否进入, 默认应该所有权限打开, 即 drwxrwxrwx, 最大为777。

umask值默认为022,新建时 
文件:
666 - 022 = 644,即-rw-r--r--, 注意普通文件默认是没有执行权限的。 
目录:
777 - 022 = 755,即drxwr-xr-x,  注意x表示的是进去目录的权限,默认是打开的。

可以利用umask该变umask值
lejiang@ubuntu:~$ umask 002
*************************

3. 用户HOME目录下的.bashrc和.bash_profile文件的功能有什么区别?

4. 写出完成以下功能的gdb命令(可以使用命令简写形式):
1) 使用gdb调试程序foo, 使用coredump文件core.12023;
2) 查看线程信息
3) 查看调用堆栈
4) 在类ClassFoo的函数foo上设置一个断点
5) 设置一个断点, 当表达式expr的值被改变时触发

5. 
1) 例举Linux下多线程编程常用的pthread库提供的函数名并给出简要说明(至少给出5个)
2) pthread库提供哪两种线程同步机制, 列出主要API
3) 使用pthread库的多线程程序编译时需要加什么连接参数?

第五部分(选作): Windows开发
1. DC(设备上下文)有哪几类? 区别在哪里?

2. 碰撞检测是游戏中经常要用到的基本技术 对于二维情况, 请回答以下问题:
1). 如何判断一个点在一个多边形内
2). 如何判断两个多边形相交
3). 如何判断两个点集所形成的完全图所围的区域是否相交

3. PostMessage SendMessage和PostThreadMessage的区别是什么
4. 什么叫Alpha混合? 当前流行的图片格式中哪些支持alpha通道? Layered Window和普通Window有什么区别?

5. 如果要实现一个多线程(非MFC)程序, 选择多线程CRT, 创建线程的时候应该用CreateThread还是_beginthreadex(), 为什么?

第六部分(选作): 数据库开发
1. 基于哈希的索引和基于树的索引有什么区别?
2. User表用于记录用户相关信息, Photo表用于记录用户的照片信息, 两个表的定义如下:
CREATE TABLE User( --用户信息表
UserId bigint,   --用户唯一id
Account varchar(30)   --用户唯一帐号
);
CREATE TABLE Photo(   --照片信息表
PhotoId bigint, --照片唯一id
UserId bigint,   --照片所属用户id
AccessCount int,   --访问次数
Size bigint   --照片文件实际大小
)
1) 请给出SQL打印帐号为"dragon"的用户访问次数最多的5张照片的id;
2) 给出SQL打印拥有总的照片文件大小(total_size)最多的前10名用户的id, 并根据total_size降序排列
3) 为优化上面两个查询, 需要在User和Photo表上建立什么样的索引?
4) 简述索引对数据库性能的影响?
3. 什么是两阶段提交协议?
4. 数据库事务基本概念:
1) 什么是事务的ACID性质?
2) SQL标准中定义的事务隔离级别有哪四个?
3) 数据库中最常用的是哪两种并发控制协议?
4) 列举你所知的数据库管理系统中采用的并发控制协议
5. 数据库中有表User(id, name, age):
表中数据可能会是以下形式:
id   name   age
001 张三   56
002 李四   25
003 王五   56
004 赵六   21
005 钱七   39
006 孙八   56
..............
由于人员年龄有可能相等, 请写出SQL语句, 用于查询age最大的人员中, id最小的一个记录
6. 并发访问数据库时常使用连接池, 请问使用连接池的好处是什么? 对于有多台应用服务器并发访问一台中心数据库的情况, 数据库访问往往成为系统瓶颈, 请问在应用服务器上设计和使用连接池时该注意哪些问题, 以保证系统的可靠性 正确性和整体性能. 假设每台应用服务器都执行相同的任务并且负载均衡.

第七部分(选作): Web开发

3. HTTP协议相关知识
A) 常见的HTTP Request头字段有哪些?
B) web服务器如何区分访问者是普通浏览用户还是搜索引擎的Spider?
C) cookie按生命周期分类分为哪两类? 其生命周期分别是多长? 向浏览器设置cookie时cookie有哪些属性可以设置, 分别起到什么作用?
D) HTTP协议中Keep-Alive是什么意思? 使用Keep-Alive有何好处, 对服务器会有什么不利的影响? 对于不利的影响有什么解决方案
4. 简述你最常用的Web服务器的一种或者几种, 并说明如何在Web服务器和应用服务器之间建立反向代理
5. 简述你所了解的MVC各层次的常用开发框架, 说明其特点
6. 简述Web应用环境下远程调用的几种方式, 并且从性能 异构性等方面比较其优劣

第八部分(选作): Flash开发

第九部分(选作): 软件测试
1. 请描述你对测试的了解, 内容可以涉及测试流程, 测试类型, 测试方法, 测试工具等
2. 如果有一天你早上上班, 发现不能上网了, 你会用什么步骤找出问题所在?
3. Web应用中实现了好友功能, 用户可以给别人发"加为好友"的请求, 发了请求后可以取消请求, 对方收到请求后, 可以选择接受或者拒绝. 互为好友的两个人, 每个人都可以单方面删除对方, 请设想尽可能多的路径对此功能设计测试用例, 每个用例包括测试步骤和预期结果
4. 公司开发了一个web聊天工具, 用于网络用户之间的聊天, 一个人同时可以和多个人聊天, 功能类似于MSN等等IM工具
要求该系统能承受1万个在线用户, 平均每个用户会和3个人同时聊天, 在网络条件正常的情况下, 要求用户收到消息的延迟时间不超过1分钟. 现在需要对系统进行性能测试, 验证系统是否达到预定要求, 请你写一个性能测试方案. 提示如下:
1) 性能测试的过程一般都是模拟大量客户端操作, 同时监控服务器的性能和客户端相应, 根据服务器的性能指标和客户端响应状况进行分析和判断
2) 系统的性能问题可以从两个角度考虑, 一个是服务器问题, 设计得不好的程序, 在大负载或者长时间运行情况下, 服务器会down机; 另一个是客户端问题, 在负载大的时候, 客户端响应会变慢
3) 在答题中, 可以不涉及性能测试工具, 监控工具等细节, 把你的测试思路说清楚就可以
5. 自动功能测试中会将测试用例组织成测试集合来统一运行, 测试集合suite按功能分类可以有若干个模块module, 每个模块module下包含若干个测试用例test. 现测试集合已经运行完毕, 但是需要在测试报告中统计各个模块的用例失败率, 将失败率超过20%的模块名与其失败率记录下来报警, 请编写实现上述功能的getTestReport函数. 可使用Java或C++等您熟悉的编程语言, 提供的接口及方法如下:
测试集合接口Isuite:
CollectiongetTests()   //得到测试集合下的所有测试用例test
测试用例接口Itest:
String getModule()   //得到该用例对应的模块名称module
int getResult()   //得到该用例的执行结果:0失败 1成功
报警函数: 
void alertMessage(String message)
public static void getTestReport(ISuite suite){
   //你的实现写在这里
}

**************************************************************
网易游戏2010游戏测试工程师笔试题回忆版分享:
http://bbs.yingjiesheng.com/thread-251068-1-1.html

游戏知识:
梦幻西游和大话西游的游戏类型是?
列举五个以上网易自住研发并运营的网络游戏
列举五个以上的游戏公司
GM是什么?其职责是?
网易接手魔兽世界时,其版本号为多少?
在你曾玩过的网络游戏中,描述该角色的职业、等级,并详细描述其技能和装备。
列举网络游戏中,玩家面对面交易这一流程的测试点。

IQ逻辑题:
在你面前有条分岔路,一条通向说谎国,一条通向诚实国。此时走来两个人,一位只说谎话,一位只说实话;你可以向此两人问路,但你只允许只允许问一个问题且只能问一次,怎样问才能找到通向说谎国?

每架飞机只有一个油箱,一箱油可供一架飞机绕地球飞半圈,空中没有加油机,但飞机之间可以相互加油。 
问:为使至少使一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机? 
(所有飞机从同一机场起飞,不允许中途降落,必须全部安全返回机场) 


你可能感兴趣的:(笔试面试,网易,笔试题)