高级工程师面试题.docx

上传人:b****7 文档编号:24995698 上传时间:2023-06-03 格式:DOCX 页数:14 大小:22.86KB
下载 相关 举报
高级工程师面试题.docx_第1页
第1页 / 共14页
高级工程师面试题.docx_第2页
第2页 / 共14页
高级工程师面试题.docx_第3页
第3页 / 共14页
高级工程师面试题.docx_第4页
第4页 / 共14页
高级工程师面试题.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

高级工程师面试题.docx

《高级工程师面试题.docx》由会员分享,可在线阅读,更多相关《高级工程师面试题.docx(14页珍藏版)》请在冰豆网上搜索。

高级工程师面试题.docx

高级工程师面试题

.net软件工程师面试题

基础题:

1.简述string[]、ArrayList、List的区别。

数组:

    优点:

o数组在内存中是连续存储的,索引速度非常快;

o赋值和修改元素也很简单;

    不足:

o两个数据之间插入数据比较麻烦;

o声明数组的时候,必须指明数组的长度,数组长度过长会造成内存浪费,数组的长度过短,会造成数据溢出错误。

ArrayList:

    优点:

o.netframework提供的用于数据存储和检索的专用类

o大小依据存储的数据来动态扩展和收缩

o继承IList,可以方便的进行数据的添加、插入和删除

    缺点:

o允许插入不同类型的数据,都当做object类型处理

o数据处理时可能出现类型不匹配的错误

o存在装箱(值=》引用)拆箱的操作,会带来很大的性能损耗

List:

    优点:

o声明List集合时,需要声明集合内数据的对象类型

o避免了类型安全问题和装箱拆箱的性能问题

2.简述装箱和拆箱操作中的性能损耗是如何产生的。

3.简述对ASP.NET中的事件机制的理解。

4.在一个ASP.NET的三层结构系统中,以登录操作为例,简述在各层中如何组织代码。

5.简述相比DATASET,实体类在WEB项目中的优点与缺点。

6.简述GC是如何工作的。

Java采用VM(VirtualMachine)机制,由VM来管理程序的运行当然也包括对GC管理。

90年代末期.NET出现了,.NET采用了和Java类似的方法由CLR(CommonLanguageRuntime)来管理。

GarbageCollector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。

已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。

这就是GC工作的原理。

为了实现这个原理,GC有多种算法。

比较常见的算法有ReferenceCounting,MarkSweep,CopyCollection等等。

目前主流的虚拟系统.NETCLR,JavaVM和Rotor都是采用的MarkSweep算法。

 Java的内存管理实际就是对象的管理,其中包括对像的分配和释放。

对于程序员来说,分配对象使用new关键字,释放对象时只是将对象赋值为null,让程序员不能够再访问到这个对象,该对象被称为“不可达”。

GC将负责回收所有“不可达”对象的内存空间。

根据GC的工作原理,可以通过一些技巧和方式让GC运行更快,高效而又合理。

编程建议如下:

o尽早释放无用对象的引用,特别注意一些复杂对象,如数组,队列等。

对于此类对象,GC回收它们的效率一般较低,如果程序允许,应尽早将不用的引用对象赋为null,这样可以加速GC的工作。

o尽量少用finalize函数。

finalize是java提供给程序员用来释放对象或资源的函数,但是它会加大GC的工作量,因此尽量少采用finalize函数回收资源。

 当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是java语言规范并不保证GC一定会执行。

.NET的GC机制有这样两个问题:

o 首先,GC并不是能释放所有的资源。

它不能自动释放非托管资源。

o 第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。

o GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。

所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。

使用using语句可以简化资源管理

7.简述3个熟悉的设计模式。

       简单工厂模式(只适用于业务简单的情况):

有三种角色组成:

∙工厂类角色(只有一个工厂类)

∙抽象产品角色

∙具体产品角色

 工厂方法模式(当产品种类非常多时会出现大量与之对应的工厂类):

有四种角色

∙抽象工厂角色

∙具体工厂角色

∙抽象产品角色

∙具体产品角色

简单工厂和工厂方法结合能够减少工厂类。

使用这两种模式能够提高扩展性和维护性

抽象工厂模式(需要创建的对象比较复杂):

满足条件:

∙系统中有多个产品族,而系统一次只可能消费其中一族产品

∙同属于同一个产品族的产品一起使用时。

组成角色:

∙抽象工厂角色

∙具体工厂角色

∙抽象产品角色

∙具体产品角色

8.简述UDP协议特点,以及如何提高UDP传输可靠性。

9.简述.NET2.0,.NET3.0,.NET3.5各版本中推出的新特性。

10. const和readonly的区别

我们都知道,const和staticreadonly的确很像:

通过类名而不是对象名进行访问,在程序中只读等等。

在多数情况下可以混用。

二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。

而staticreadonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。

明白了这个本质区别,我们就不难看出下面的语句中staticreadonly和const能否互换了:

1.staticreadonlyMyClassmyins=newMyClass();

2.staticreadonlyMyClassmyins=null;

3.staticreadonlyB=10; staticreadonlyA=B*20;

4.staticreadonlyint[]constIntArray=newint[]{1,2,3};

5.voidSomeFunction()

  {

   constinta=10;

   ...

  }

6.privatestaticstringastr="abcd";

 privateconststringstr=astr+"efg";

1:

不可以换成const。

new操作符是需要执行构造函数的,所以无法在编译期间确定

2:

可以换成const。

我们也看到,Reference类型的常量(除了String)只能是Null。

3:

可以换成const。

我们可以在编译期间很明确的说,A等于200。

4:

不可以换成const。

道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。

5:

不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。

6.错误:

如果在astr前加上const或者const改为readonly即可;

总结:

1.const、readonly和staticreadonly定义的常量,指定初始值后(包括在构造函数内指定的初始值)将不可更改,可读不可写;

     2.const定义时必须指定初始值,而readonly定义时可以不进行初始化(MS建议在定义时初始值),同时也可以在构造函数内指定初始值,

     并以构造函数内指定的值为准;

     3.const和staticreadonly定义的常量是静态的,只能由类直接访问;而readonly定义的常量是非静态的,只能由实例对象访问; 

     4.staticreadonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数;

     5.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。

在应用上以staticreadonly代替const,以平衡const在灵活性上的不足, 同时克服编译器优化cosnt性能,所带来的程序集引用不一致问题;

 

算法题:

(以下三题不用作答,想好思路面试谈即可)

1.一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。

0是例外,可以反复出现。

请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。

注意:

-5个数值允许是乱序的。

比如:

87506

-0可以通配任意数值。

比如:

87506中的0可以通配成9或者4

-0可以多次出现。

-复杂度如果是O(n2)则不得分。

解题思路:

1.取5个数中非0的最大数和最小数,之差不大于4则连续,否则不连续。

 

2.要增加两个特例:

1)全0算连续,2)只有一个非0算连续

代码实例

 

[java] viewplain copy

 print?

__

1.

14px;">

Microsoft YaHei;font-size:

12px;color:

#333333;">

12px;">#include    

2.#include    

3.using namespace std;    

4.    

5.int check(int arry[5])    

6.{    

7.    int max=0,min=65535;    

8.    int zerocount=0;    

9.    for(int i=0;i<5;i++)    

10.    {    

11.        if(arry[i]==0)    

12.            zerocount++;    

13.        else    

14.        {    

15.            if(arry[i]>max)    

16.                max=arry[i];    

17.            if(arry[i]

18.                min=arry[i];    

19.        }    

20.    }    

21.    if(zerocount>=4)    

22.        return 1;    

23.    else    

24.    {    

25.        if(max-min<=4)    

26.            return 1;    

27.        else     

28.            return 0;    

29.    }    

30.}    

31.    

32.int main()    

33.{    

34.    int arry[5];    

35.    cout<<"一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现;0是例外,可以反复出现"<

36.    for(int i=0;i<5;i++)    

37.        cin>>arry[i];    

38.    int p=check(arry);    

39.    if(p)    

40.        cout<<"连续"<

41.    else    

42.        cout<<"不连续"<

43.    system("pause");    

44.}   

输入:

12305

输出:

连续

2.设计一个在一百万个数字中求十个最大的数算法

[java] viewplain copy

 print?

__

1.

14px;">

Microsoft YaHei;font-size:

12px;color:

#333333;">

12px;">int data[M];  

2.int top[N + 1];  

3.  

4.  

5.void top_N()  

6.{  

7.    top[0] = std:

:

numeric_limits:

:

max(); // Set a "guard" on the boundary to reduce comparision times.  

8.    for (int i = 1; i <= N; ++i) top[i] = std:

:

numeric_limits:

:

min();  

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

10.    {  

11.        for (int k = N; top[k] < data[j]; --k) top[k] = top[k - 1];  

12.        top[k + 1] = data[j];  

13.    }  

14.}  

3.有如下输入:

若干个由大写英文字母构成的单词,以’,’号隔开。

如“ABCCD,CDA,BCDD,DCA,ADC,BCD,CDCAB”。

写一段程序,从输入中寻找由相同字符构成(重复字符出现次数也是一样)的单词组输出。

如以上输入,则输出:

第1组:

ABCCD,CDCAB

第2组:

CDA,DCA,ADC

[java] viewplain copy

 print?

__

1.

14px;">

Microsoft YaHei;font-size:

12px;color:

#333333;">

12px;">string s = "ABCCD,CDA,BCDD,DCA,ADC,BCD,CDCAB";  

2.var query = s.Split(',').GroupBy(x => x.OrderBy(y => y));  

3.foreach (var item in query)  

4.Console.WriteLine(string.Join(",", item.ToArray()));  

项目&管理:

(以下两题不用作答,想好思路面试谈即可)

1.假设你做为一个开发团队的领导者,经过长时间的磨合,有了一只10人左右的不错的团队。

其中每个成员都在其职位上有不可或缺的作用。

现由于一些原因,需要你辞退其中一人。

你会如何处理这件事情?

2.有一套公司自己开发供本公司使用的CRM系统,其中的权限控制过于简单。

现需要你重新设计其权限系统,你会如何开展这个工作?

1、文件路径文本转换编写一个函数,输入参数:

·页面文件的虚拟路径(stringpageVirPath,例如:

~/abc/def/page.aspx)

·图片文件的虚拟路径(stringimgVirPath,例如:

~/ghi/image/pic.gif)

处理:

计算出图片文件相对页面文件的相对路径,例如:

../../ghi/image/pic.gif

返回:

相对路径

要求:

a、不要求严格的C#语言表述,可适当使用伪码,着重要表达清楚处理逻辑;

b、尽量使用正则表达式

2、DataTable内数据转换编写一个函数,输入参数:

·源数据表(DataTablesrcTable),该表中已包含int型数据列”isSys”,数据为0或-1,

处理:

直接处理源数据表,将”isSys”数据列替换为string型的”系统”数据列,

当”isSys”列中值为0,则”系统”列值为空字符串,

当”isSys”列中值为-1,则”系统”列值为”系统”。

返回:

操作是否成功(bool);

要求:

a、不要求严格的C#语言表述,可适当使用伪码,着重要表达清楚处理逻辑;

b、不抛出任何异常(包括.net异常)

设计模式面试题:

1,WindowsMediaPlayer和RealPlayer是常用的媒体播放器,它们的API结构和调用方法非常不同,现在你的应用需要同时支持调用这2种播放器的API。

你要怎么设计?

2,现在有一种空调,它支持3种模式:

HotAir,CoolAir和DoNothing。

例如,当选择HotAir模式时,再选择温度为20度,空调将输送热风;选择CoolAir模式,温度设置为20度时,将输送冷风;在选择DoNothing模式时,空调什么都不做。

你将考虑如何为空调设计应用程序?

如果将来空调需要增加支持新的模式呢?

一、第一题的解:

适配器模式+抽象工厂模式

我采用了抽象工厂模式+适配器模式,先上图:

_

设计的重点是:

1,首先看适配器模式。

MediaPlayerClassA和RealPlayerClassA都实现了IMediaA接口。

MediaPlayerClassA调用MediaPlayer的APIs来实现IMediaA接口定义的功能;RealPlayerClassA则调用RealPlayerAPIs。

2,再来看抽象工厂模式。

MediaPlayerFactory和RealPlayerFactory继承自抽象类MediaFactory类,MediaPlayerFactory用来创建MediaPlayer产品族;RealPlayerFactory用来创建RealPlayer产品族。

虽然上图中只画出了IMediaA接口,但事实上我们可能需要实现多个接口如IMediaB,IMediaC等,这就是这里为什么使用抽象工厂模式。

3,抽象类MediaFactory实现了一个静态方法CreateFactory,用来创建具体工厂,该方法返回MediaFactory类型的对象给Client,这样,Client不就需要知道它操作的是那个具体工厂。

CreateFactory方法采用反射技术,这样,不需要修改CreateFactory方法的代码,就可以支持以后添加新的具体工厂。

4,工厂类返回IMediaA接口给Client,Client操作IMediaA接口而不需要知道它具体使用的是MediaPlayerClassA还是RealPlayerClassA的实例。

序列图如下:

_

二、第二题的解:

Flyweight模式

我采用了Flyweight(桥梁)模式,先上图:

_

设计的重点是:

1,把AirConditioner和它支持的Model分离开来,在AirConditioner类的实例中保存它支持的所有Model类的实例,这样做的好处是1)如果只是支持的Model有变化,不需要去实现新的AirConditioner类,只要添加或删除支持的Model即可。

2)多个不同的AirConditioner类可以方便地共享共同的Model类,否则,可能需要复杂的继承关系才能在不同AirConditioner类之间共享Model。

事实上,AirConditioner类和Model类的关系非常类似于桥梁模式中抽象类和实现类的关系。

2,采用Flyweight模式。

在多个AirCondition实例中,共享Model的实例,这样可以大大地节省存储空间。

ModelFactory用于创建Model实例并返回给AirCondition,它保存了一个Model池,每种类型的Model只有一个实例。

在Model类中只保存内蕴状态,AirConditioner类保存外蕴状态,调用Model类的Execute方法时,需要把IAirConditioner作为外蕴状态传递给方法(或者也可以使用专门的状态类作为外蕴状态)。

序列图如下:

_

数据库基础面试题

1.教师号  星期号 是否有课 

 1    2   有 

 1    3   有 

 2    1   有 

 3    2   有` 

 1    2   有 

写一条sql语句让你变为这样的表 

教师号 星期一 星期二 星期三 

 1       2   1  

 2   1    

 3       1 

各星期下的数字表示:

对应的教师在星期几已经排的课数

T-SQL实现:

[sql] viewplain copy

 print?

__

1.

14px;">

Microsoft YaHei;font-size:

12px;color:

#333333;">CREATE TABLE COURSE_test (  

2."教师号" INT,  

3."星期号" INT ,  

4."是否有课" nvarchar(20)  

5.)  

6.  

7.insert into COURSE_test  

8.VALUES(1,2,'有');  

9.  

10.select 教师号,  

11.count(case when(星期号=1) AND (是否有课='有')then 教师号 else null end) as 星期一,  

12.count(case when(星期号=2) AND (是否有课='有')then 教师号 else null end) as 星期二,  

13.count(case when(星期号=3) AND (是否有课='有')then 教师号 else null end) as 星期三  

14.from COURSE_test   

15.group by 教师号  

运行select语句结果如下:

_

非技术(面谈):

1.在上份工作中,自己体现最大的优点和缺点是什么。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1