一篇完整的网易笔试题.docx
《一篇完整的网易笔试题.docx》由会员分享,可在线阅读,更多相关《一篇完整的网易笔试题.docx(24页珍藏版)》请在冰豆网上搜索。
![一篇完整的网易笔试题.docx](https://file1.bdocx.com/fileroot1/2023-1/6/bcd8ea18-a394-46c2-82a7-c2220de2eadf/bcd8ea18-a394-46c2-82a7-c2220de2eadf1.gif)
一篇完整的网易笔试题
一篇完整的网易笔试题
发布时间:
2010-11-04来源:
应届毕业生求职网
卷(研发类笔试题)
第一部分(必做):
计算机科学基础
1.(单选)软件设计中模块划分应该遵循的准则是:
A.低内聚低耦合B.高内聚低耦合C.低内聚高耦合D.高内聚高耦合
2.(单选)最坏情况下时间复杂度不是n(n-1)/2的排序算法是:
A.快速排序(n^2)B.冒泡排序(n^2)C.直接插入排序(n^2)D.堆排序(nlogn)
3.哈希表中解决冲突的方法通常可以分为openaddressing和chaining两类,请分别解释这两类冲突解决方法的大致实现原理
//见书
4.简单的链表结构拥有很好的插入删除节点性能,但随机定位(获取链表第n个节点)操作性能不佳,请你设计一种改进型的链表结构优化随机定位操作的性能,给出设计思路及其改进后随机定位操作的时间复杂度
具体参见PurelyFunctionalRandom-AccessLists.pdf
大概地说,节点构成多棵相连的完全二叉树来表示(为了不浪费节点),存取顺序为前序遍历。
复杂度为O(log n )
这里有代码
http:
//www.cs.oberlin.edu/~jwalker/ra-list/
5.什么是NP问题?
列举典型的NP问题(至少两个)?
对于一个给定的问题你通常如何判断它是否为NP问题?
NP(NondeterministicPolynomial问题)。
但是对于很多问题来说,他们找不到一个多项式的解决方法,
,只能“尝试”很多种方案
才能够得出一个答案,这显然是很费时的,这种问题未NP问题。
NPC(NPComplete)问题,可以这么认为,这种问题只有把解域里面的所有可能都穷举了之后才能得出答案,这样的问题是NP里面最难
旅行商问题TSPTravellingSalesmanProblem
子集和问题
Hamilton回路
要满足两个条件:
1.封闭的环
2.是一个连通图,且图中任意两点可达
经过图(有向图或无向图)中所有顶点一次且仅一次的通路称为哈密顿通路。
经过图中所有顶点一次且仅一次的回路称为哈密顿回路。
最大团问题
6.以下是一个tree的遍历算法,queue是FIFO队列,请参考下面的tree,选择正确的输出.
1
/\
2 3
/\/\
4567
queue.push(tree.root)
while(true){
node=queue.pop();
output(node.value);//输出节点对应数字
if(null==node)
break;
for(child_nodeinnode.children){
queue.push(child_node);
}
}
A.1234567
B.1245367
C.1376254
D.1327654
第二部分(选作):
C/C++程序设计
1.有三个类ABC定义如下,请确定sizeof(A)sizeof(B)sizeof(C)的大小顺序,并给出理由
structA{
A(){}
~A(){}
intm1;
intm2;
};
structB{
B(){}
~B(){}
intm1;
charm2;
staticcharm3;
};
structC{
C(){}
virtual~C(){}
intm1;
shortm2;
};
//8//8//12
2.请用C++实现以下print函数,打印链表I中的所有元素,每个元素单独成一行
voidprint(conststd:
:
list&I){
}
#include
#include
voidprint(conststd:
:
list&I)
{
std:
:
list:
:
const_iteratoriter;
for(iter=I.begin();iter!
=I.end();iter++)
printf("%d\n",*iter);
}
intmain()
{
std:
:
listL;
L.push_back
(1);
L.push_back
(2);
L.push_back(3);
print(L);
return0;
}
3.假设某C工程包含a.c和b.c两个文件,在a.c中定义了一个全局变量foo,在b.c中想访问这一变量时该怎么做?
增加一个a.h,写上externintfoo,然后让a.c和b.c都包含a.h
4.C++中的new操作符通常完成两个工作,分配内存及其调用相应的构造函数初始化
请问:
1)如何让new操作符不分配内存,只调用构造函数?
2)这样的用法有什么用?
解答:
(要求new显式调用构造函数,但不分配内存。
)
题目要求不能生成内存还要调用构造函数说明这个类里面没有对内部操作但可以对外部操作比如static的数
摘录:
如果我是用new分配对象的,可以显式调用析构函数吗?
可能不行。
除非你使用定位放置new.
classFred
{public:
Fred()
{
cout<<"fuck";
}
};
intmain()
{
Fred*f=new((void*)10000)Fred();
system("pause");
} 其中这个10000可以是任意数,但不能为0
2)
定位放置new(placementnew)有很多作用。
最简单的用处就是将对象放置在内存中的特殊位置。
这是依靠new表达式部分的指针参数的位置来完成的:
#include //必须#include这个,才能使用"placementnew"
#include"Fred.h" //classFred的声明
voidsomeCode()
{
charmemory[sizeof(Fred)]; //Line#1
void*place=memory; //Line#2
Fred*f=new(place)Fred(); //Line#3(详见以下的“危险”)
//Thepointersfandplacewillbeequal
//...
}
Line#1在内存中创建了一个sizeof(Fred)字节大小的数组,足够放下Fred对象。
Line#2创建了一个指向这块内存的首字节的place指针(有经验的C程序员会注意到这一步是多余的,这儿只是为了使代码更明显)。
Line#3本质上只是调用了构造函数Fred:
:
Fred()。
Fred构造函数中的this指针将等于place。
因此返回的f将等于place。
Line#3本质上只是调用了构造函数Fred:
:
Fred()。
*********************************************************
placement new的作用就是:
创建对象但是不分配内存,而是在已有的内存块上面创建对象。
用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。
#include
#include
const intchunk = 16;
class Foo
{
public :
int val( ) { return _val; }
Foo( ) { _val = 0; }
private :
int_val;
};
//预分配内存,但没有Foo对象
char*buf = new char[ sizeof(Foo) * chunk ];
int
main( void )
{
//在buf中创建一个Foo对象
Foo*pb = new (buf) Foo;
//检查一个对象是否被放在buf中
if ( pb->val() == 0 )
{
cout <<"new expressio worked!
" <}
//到这里不能再使用pb
delete[] buf;
return 0;
}
#include
usingnamespacestd;
classa
{
intmV;
public:
void*operatornew(size_tsize,void*mem)
{
returnmem;
}
a(intv)
{
printf("aconstructor\n");
mV=v;
}
~a()
{
printf("adestructor\n");
}
voidpr()
{
printf("%d\n",mV);
}
};
intmain()
{
aa1
(1);
a1.pr();
void*p=&a1;
a*a2=new(p)a
(2);
a2->pr();
a1.pr();
return0;
}
5.下面这段程序的输出是什么?
为什么?
classA{
public:
A(){p();}
virtualvoidp(){print("A")}
virtual~A(){p();}
};
classB{
public:
B(){p();}
voidp(){print("B")}
~B(){p();}
};
intmain(int,char**){
A*a=newB();
deletea;
}
6.什么是C++Traits?
并举例说明
http:
//accu.org/index.php/journals/442
Thinkofatraitasasmallobjectwhosemainpurposeistocarryinformationusedbyanotherobjectoralgorithmtodetermine"policy"or"implementationdetails"
Traits可以说是一个小小的信息体,其它对象或算法可以根据它来选择不同的执行政策功实现细节。
比如std中numeric_limits:
:
max()
第三部分(选作):
JAVA程序设计
1.(单选)以下Java程序运行的结构是:
publicclassTester{
publicstaticvoidmain(String[]args){
Integervar1=newInteger
(1);
Integervar2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
publicstaticvoiddoSomething(Integerinteger){
integer=newInteger
(2);
}
}
A.1true
B.2true
C.1false
D.2false
java中的值传递和引用传递
值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:
也称为传地址。
方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
下面举例说明:
传值---传递基本数据类型参数
public class PassValue{
staticvoidexchange(inta,intb){//静态方法,交换a,b的值
inttemp;
temp=a;
a=b;
b=temp;
}
publicstaticvoidmain(String[]args){
inti=10;
intj=100;
System.out.println("beforecall:
"+"i="+i+"\t"+"j="+j);//调用前
exchange(i,j); //值传递,main方法只能调用静态方法
System.out.println("aftercall:
"+"i="+i+"\t"+"j="+j);//调用后
}
}
运行结果:
beforecall:
i=10 j=100
after call:
i=10 j=100
说明:
调用exchange(i,j)时,实际参数i,j分别把值传递给相应的形式参数a,b,在执行方法exchange()时,形式参数a,b的值的改变不影响实际参数i和j的值,i和j的值在调用前后并没改变。
引用传递---对象作为参数
如果在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。
这是实际参数与形式参数指向同一个地址,即同一个对象(数组),方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。
classBook{
Stringname;
privatefolatprice;
Book(Stringn, float){ //构造方法
name=n;
price=p;
}
static void change(Booka_book, Stringn, floatp){ //静态方法,对象作为参数
a_book.name=n;
a_book.price=p;
}
publicvoidoutput(){ //实例方法,输出对象信息
System.out.println("name:
"+name+"\t"+"price:
"+price);
}
}
publicclassPassAddr{
publicstaticvoidmain(String[]args){
Bookb=newBook("java2", 32.5f);
System.out.print("beforecall:
\t"); //调用前
b.output();
b.change(b, "c++", 45.5f); //引用传递,传递对象b的引用,修改对象b的值
System.out.print("aftercall:
\t"); //调用后
b.output();
}
}
运行结果:
before call:
name:
java2 price:
32.5
after call:
name:
c++ price:
45.5
说明:
调用change(b,"c++",45.5f)时,对象b作为实际参数,把引用传递给相应的形式参数a_book,实际上a_book也指向同一个对象,即该对象有两个引用名:
b和a_book。
在执行方法change()时,对形式参数a_book操作就是对实际参数b的操作。
而题目中的Integer属于基础类型,和int一样对待
2.(单选)往OuterClass类的代码段中插入内部类声明,哪一个是正确的:
publicclassOuterClass{
privatefloatf=1.0f;
//插入代码到这里
}
A.
classInnerClass{
publicstaticfloatfunc(){returnf;}//错,static函数不能在非静态的内嵌类中定义,另外不能引用非静态的f
}
B.
abstractclassInnerClass{
publicabstractfloatfunc(){}//错,abstract函数无body
}
C.
staticclassInnerClass{
protectedstaticfloatfunc(){returnf;}///错,不能引用非静态的f
}
D.
publicclassInnerClass{
staticstaticfloatfunc(){returnf;}///错,
}
3.Java中的interface有什么作用?
举例说明哪些情况适合用interface,哪些情况下适合用抽象类.
WhenToUseInterfaces
An interface allowssomebodytostartfromscratchtoimplementyour interface orimplementyour interface insomeothercodewhoseoriginalorprimarypurposewasquitedifferentfromyour interface.Tothem,your interface isonlyincidental,somethingthathavetoaddontothetheircodetobeabletouseyourpackage.Thedisadvantageiseverymethodintheinterfacemustbe public.Youmightnotwanttoexposeeverything.
WhenToUseAbstractclasses
An abstract class,incontrast,providesmorestructure.Itusuallydefinessomedefaultimplementationsandprovidessometoolsusefulforafullimplementation.Thecatchis,codeusingit must useyourclassasthebase.Thatmaybehighlyinconvenientiftheotherprogrammerswantingtouseyourpackagehavealreadydevelopedtheirownclasshierarchyindependently.InJava,aclasscaninheritfromonlyonebaseclass.
更具体
4.Java多线程有哪几种实现方式?
Java中的类如何保证线程安全?
请说明ThreadLocal的用法和适用场景
书
javasynchronized详解
(一)
文章分类:
Java编程
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。
也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。
结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用.
举例说明:
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
packageths;
publicclassThread1implementsRunnable{
publicvoidrun(){
synchronized(this){
for(inti=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"synchronizedloop"+i);
}
}
}
publicstaticvoidmain(String[]ar