华为面试题九套.docx

上传人:b****4 文档编号:24614765 上传时间:2023-05-29 格式:DOCX 页数:80 大小:55.60KB
下载 相关 举报
华为面试题九套.docx_第1页
第1页 / 共80页
华为面试题九套.docx_第2页
第2页 / 共80页
华为面试题九套.docx_第3页
第3页 / 共80页
华为面试题九套.docx_第4页
第4页 / 共80页
华为面试题九套.docx_第5页
第5页 / 共80页
点击查看更多>>
下载资源
资源描述

华为面试题九套.docx

《华为面试题九套.docx》由会员分享,可在线阅读,更多相关《华为面试题九套.docx(80页珍藏版)》请在冰豆网上搜索。

华为面试题九套.docx

华为面试题九套

一.华为一道面试题-1-n排序

有N个大小不等的自然数(1--N),请将它们由小到大排序。

要求程序算法:

时间复杂度为O(n),空间复杂度为O

(1)。

网上转的,一开始也没有注意到最开始的半句。

算法:

N个不等的自然数1~N,排序完成后必然为1~N。

所以可以一次遍历,遇到a[i]!

=i的就把a[i]和a[a[i]]交换。

voidsort(inta[],intn)

{

inti;

intt;/*临时变量:

空间复杂度O

(1)*/

for(i=1;i

{

while(a[i]!

=i)

{

t=a[a[i]];

a[a[i]]=a[i];//排好一个元素

a[i]=t;

}

}

}

二.一次遍历找链表倒数第n个节点

一道面试题目,阿明和晨晨看到并且告诉我答案的。

要求通过一次遍历找到链表中倒数第n个节点,链表可能相当大,可使用辅助空间,但是辅助空间的数目必须固定,不能和n有关。

算法思想:

两根指针,第一根先出发,相距n步后第二根出发。

然后同时步进,直到第一根指针达到末尾。

structiNode{

intvalue;

iNode*next;

};

iNode*getresult(iNode*head,intn)

{

iNode*pfirst;

iNode*psecond;

pfirst=head;

intcounter;

for(counter=0;counter

pfirst=pfirst->next;

}

psecond=head;

while(pfirst!

=NULL){

pfirst=pfirst->next;

psecond=psecond->next;

}

returnpsecond;

}

三.VC++学习笔记

1.日期转成字符串:

COleDateTimeww;

ww=COleDateTime:

:

GetCurrentTime();

AfxMessageBox(ww.Format("%Y-%m-%d%H:

%M:

%S"));

2.字符串转成日期:

COleDateTimedt;

dt.ParseDateTime(“2006-08-0808:

08:

08”);

3.资源文件

资源文件名:

xxx.rc,其中要包含的主要文件:

resource.h和afxres.h

4.vc开发环境没有自动提示时:

删除目录下的ncb文件,再打开一般就ok了

5.利用_variant_t取数据库数据的方法:

_variant_tibb;

ibb=(_variant_t)rs->GetCollect("inta");

if(ibb.vt!

=VT_NULL)

{

m_b=ibb.lVal;

}

6.平时取记录集字段值的方法:

(LPCTSTR)(_bstr_t)rs->GetCollect("datea")

7.DoModal()可以返回两个结果IDOK,IDCANCEL,他们都是int型,分别是:

1,2。

通过EndDialog(IDOK)的方式返回。

8.一般将数据库连接方面的信息放到app中。

则AfxGetApp()非常重要,如;

CAdo2App*mapp=(CAdo2App*)AfxGetApp();

Map->conn->Execute(sql,NULL,adCmdText);

9.DECLARE_DYNCREATE(类名),IMPLEMENT_DYNCREATE(类名,基类名)使得由CObject继承来的类在程序运行的时候能够动态的创建。

10.DECLARE_DYNAMIC(类名),IMPLEMENT_DYNAMIC(类名,基类名)可以在运行时获得该类的信息

11.DECLARE_SERIAL(类名),IMPLEMENT_SERIAL(类名,基类名,0)为一个可以串行化的CObject派生类产生必要的C++标题代码

12.获得文档的方法:

CMainFrame*pFrame=(CMainFrame*)AfxGetMainWnd();

CPClientDoc*pDoc=(CPClientDoc*)pFrame->GetActiveDocument();

13.获得视图的方法:

CMainFrame*pFrame=(CMainFrame*)AfxGetMainWnd();

myView=(CPClientView*)pFrame->GetActiveView();

14.如果要引用全局变量或者全局方法,须在当前类中引入:

extern名字;

21.Newdelete与mallocfree的联系与区别?

答案:

都是在堆(heap)上进行动态的内存操作。

用malloc函数需要指定内存分配的字节数并且不能初始化对象,new会自动调用对象的构造函数。

delete会调用对象的destructor,而free不会调用对象的destructor.

22.#defineDOUBLE(x)x+x,i=5*DOUBLE(5);i是多少?

答案:

i为30。

23.有哪几种情况只能用intializationlist而不能用assignment?

答案:

当类中含有const、reference成员变量;基类的构造函数都需要初始化表。

24.C++是不是类型安全的?

答案:

不是。

两个不同类型的指针之间可以强制转换(用reinterpretcast)。

C#是类型安全的。

25.main函数执行以前,还会执行什么代码?

答案:

全局对象的构造函数会在main函数之前执行。

26.描述内存分配方式以及它们的区别?

1)从静态存储区域分配。

内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。

例如全局变量,static变量。

2)在栈上创建。

在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

栈内存分配运算内置于处理器的指令集。

3)从堆上分配,亦称动态内存分配。

程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。

动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

27.struct和class的区别

答案:

struct的成员默认是公有的,而类的成员默认是私有的。

struct和class在其他方面是功能相当的。

从感情上讲,大多数的开发者感到类和结构有很大的差别。

感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。

既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!

)时,你也许应该使用struct关键字,否则,你应该使用class关键字。

28.当一个类A中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。

(Autodesk)

答案:

肯定不是零。

举个反例,如果是零的话,声明一个classA[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。

29.在8086汇编下,逻辑地址和物理地址是怎样转换的?

(Intel)

答案:

通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。

30.比较C++中的4种类型转换方式?

请参考:

dynamic_cast和reinterpret_cast的区别和应用。

31.分别写出BOOL,int,float,指针类型的变量a与“零”的比较语句。

答案:

BOOL:

if(!

a)orif(a)

int:

if(a==0)

float:

constEXPRESSIONEXP=0.000001

if(a-EXP)

pointer:

if(a!

=NULL)orif(a==NULL)

32.请说出const与#define相比,有何优点?

答案:

1)const常量有数据类型,而宏常量没有数据类型。

编译器可以对前者进行类型安全检查。

而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

33.简述数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。

指针可以随时指向任意类型的内存块。

(1)修改内容上的差别

chara[]=“hello”;

a[0]=‘X’;

char*p=“world”;//注意p指向常量字符串

p[0]=‘X’;//编译器不能发现该错误,运行时错误

(2)用运算符sizeof可以计算出数组的容量(字节数)。

sizeof(p),p为指针得到的是一个指针变量的字节数,而不是p所指的内存容量。

C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

chara[]="helloworld";

char*p=a;

cout<

cout<

计算数组和指针的内存容量

voidFunc(chara[100])

{

cout<

}

34.类成员函数的重载、覆盖和隐藏区别?

答案:

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。

此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。

此时,基类的函数被隐藏(注意别与覆盖混淆)

35.Therearetwointvariables:

aandb,don’tuse“if”,“?

:

”,“switch”orotherjudgementstatements,findoutthebiggestoneofthetwonumbers.

答案:

((a+b)+abs(a-b))/2

36.如何打印出当前源文件的文件名以及源文件的当前行号?

答案:

cout<<__FILE__;

cout<<__LINE__;

__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。

37.main主函数执行完毕后,是否可能会再执行一段代码,给出说明?

答案:

可以,可以用_onexit注册一个函数,它会在main之后执行intfn1(void),fn2(void),fn3(void),fn4(void);

voidmain(void)

{

Stringstr("zhanglin");

_onexit(fn1);

_onexit(fn2);

_onexit(fn3);

_onexit(fn4);

printf("Thisisexecutedfirst.\n");

}

intfn1()

{

printf("next.\n");

return0;

}

intfn2()

{

printf("executed");

return0;

}

intfn3()

{

printf("is");

return0;

}

intfn4()

{

printf("This");

return0;

}

The_onexitfunctionispassedtheaddressofafunction(func)tobecalledwhentheprogramterminatesnormally.Successivecallsto_onexitcreatearegisteroffunctionsthatareexecutedinLIFO(last-in-first-out)order.Thefunctionspassedto_onexitcannottakeparameters.

38.如何判断一段程序是由C编译程序还是由C++编译程序编译的?

答案:

#ifdef__cplusplus

cout<<"c++";

#else

cout<<"c";

#endif

39.文件中有一组整数,要求排序后输出到另一个文件中

答案:

#include

#include

usingnamespacestd;

voidOrder(vector&data)//bubblesort

{

intcount=data.size();

inttag=false;//设置是否需要继续冒泡的标志位

for(inti=0;i

{

for(intj=0;j

{

if(data[j]>data[j+1])

{

tag=true;

inttemp=data[j];

data[j]=data[j+1];

data[j+1]=temp;

}

}

if(!

tag)

break;

}

}

voidmain(void)

{

vectordata;

ifstreamin("c:

\\data.txt");

if(!

in)

{

cout<<"fileerror!

";

exit

(1);

}

inttemp;

while(!

in.eof())

{

in>>temp;

data.push_back(temp);

}

in.close();//关闭输入文件流

Order(data);

ofstreamout("c:

\\result.txt");

if(!

out)

{

cout<<"fileerror!

";

exit

(1);

}

for(i=0;i

out<

out.close();//关闭输出文件流

}

40.链表题:

一个链表的结点结构

structNode

{

intdata;

Node*next;

};

typedefstructNodeNode;

(1)已知链表的头结点head,写一个函数把这个链表逆序(Intel)

Node*ReverseList(Node*head)//链表逆序

{

if(head==NULL||head->next==NULL)

returnhead;

Node*p1=head;

Node*p2=p1->next;

Node*p3=p2->next;

p1->next=NULL;

while(p3!

=NULL)

{

p2->next=p1;

p1=p2;

p2=p3;

p3=p3->next;

}

p2->next=p1;

head=p2;

returnhead;

}

(2)已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序。

(保留所有结点,即便大小相同)

Node*Merge(Node*head1,Node*head2)

{

if(head1==NULL)

returnhead2;

if(head2==NULL)

returnhead1;

Node*head=NULL;

Node*p1=NULL;

Node*p2=NULL;

if(head1->datadata)

{

head=head1;

p1=head1->next;

p2=head2;

}

else

{

head=head2;

p2=head2->next;

p1=head1;

}

Node*pcurrent=head;

while(p1!

=NULL&&p2!

=NULL)

{

if(p1->data<=p2->data)

{

pcurrent->next=p1;

pcurrent=p1;

p1=p1->next;

}

else

{

pcurrent->next=p2;

pcurrent=p2;

p2=p2->next;

}

}

if(p1!

=NULL)

pcurrent->next=p1;

if(p2!

=NULL)

pcurrent->next=p2;

returnhead;

}

(3)已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。

(Autodesk)

答案:

Node*MergeRecursive(Node*head1,Node*head2)

{

if(head1==NULL)

returnhead2;

if(head2==NULL)

returnhead1;

Node*head=NULL;

if(head1->datadata)

{

head=head1;

head->next=MergeRecursive(head1-16.关联、聚合(Aggregation)以及组合(Composition)的区别?

涉及到UML中的一些概念:

关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:

500){this.resized=true;this.style.width=500;}"border=0>

从实现的角度讲,聚合可以表示为:

classA{...}classB{A*a;.....}

而组合表示contains-a的关系,关联性强于聚合:

组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:

500){this.resized=true;this.style.width=500;}"border=0>

实现的形式是:

classA{...}classB{Aa;...}

参考文章:

17.面向对象的三个基本特征,并简单叙述之?

1.封装:

将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)

2.继承:

广义的继承有三种实现形式:

实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。

前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。

3.多态:

是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

简单的说,就是一句话:

允许将子类类型的指针赋值给父类类型的指针。

18.重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

常考的题目。

从定义上来说:

重载:

是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

重写:

是指子类重新定义复类虚函数的方法。

从实现原理上来说:

重载:

编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。

如,有两个同名函数:

functionfunc(p:

integer):

integer;和functionfunc(p:

string):

integer;。

那么编译器做过修饰后的函数名称可能是这样的:

int_func、str_func。

对于这两个函数的调用,在编译器间就已经确定了,是静态的。

也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

重写:

和多态真正相关。

当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。

因此,这样的函数地址是在运行期绑定的(晚绑定)。

19.多态的作用?

主要是两个:

1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2.接口重用:

为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

20.Ado与A的相同与不同?

除了“能够让应用程序处理存储于DBMS中的数据“这一基本相似点外,两者没有太多共同之处。

但是Ado使用OLEDB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。

众所周知.NET体系不同于COM体系,ADO.NET接口也就完全不同于ADO和OLEDB接口,这也就是说ADO.NET和ADO是两种数据访问方式。

ADO.net提供对XML的支持。

>next,head2);

}

else

{

head=head2;

hea

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

当前位置:首页 > 工作范文 > 行政公文

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

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