华为面试宝典
华为面试题及答案
华为面试题及答案
2015 年的一次华为面试题及答案
华为这个公司就不介绍了,前面帖子贴出过一套它的笔试题,这次是几道面试题,我能查到的资
料表明该套面试题出于 2014年底,也比较古老吧。其实今天(2015 年 11 月 14 日)我正好也参
加了华为的面试,共面完全部四轮,第一二轮是问技术问题(我报得软件研发),第三轮面的个性方
面,最有意思的是第四轮,在我吃完它提供的午餐,和同桌的美眉聊完了天,趴在桌子上睡了一觉,
醒来和其他学生又瞎侃了一通到没话说后,终于叫我去第四面,结果只用了两分钟,3 个对话。
hr :工资你了解吧,觉得怎么样?
我:还可以
hr :有女朋友没?
我:没有
hr :在深圳工作有问题没?
我:没有
然后就让我走人,hr 的意思是要我还是敷衍几句拒我,不得而知。
不管这么多了,让我们来看看别人在 2000 年面试的时候华为都问了些什么吧。问我些什么保密。
哈哈。
1.请你分别画出 OSI 的七层网络结构图和 TCP/IP 的五层结构图。
答:OSI 七层网络结构图
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
TCP/IP 的五层结构图
应用层
运输层
网络层
数据链路层
物理层
2.请你详细地解释一下 IP 协议的定义,在哪个层上面?主要有什么作用?TCP 与 UDP 呢?
答:IP 是 Internet Protocol 的简称,是网络层的主要协议,作用是提供不可靠、无连接的数据报
传送。TCP 是 Transmit Control Protocol(传输控制协议)的缩写,在运输层,TCP 提供一种面
向连接的,可靠的字节流服务;UDP 是 User Datagram Protocol(用户数据报协议)的缩写,在
运输层,UDP 提供不可靠的传输数据服务
3.请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的?
答:交换机属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表
的建立和维护由交换机自动进行。路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,
通过路由表路由协议产生。交换机最大的好处是快速,路由器最大的好处是控制能力强。
4.请问 C++的类和 C 里面的 struct 有什么区别?
答:struct 的成员的默认访问说明符为 Public ,而 class 的成员的默认访问说明符为 Private 。其他
没有区别
-------------------------------------------
---
插播广告:版权所有:朱科 欢迎光临我的网站:www.goodsoft.cn ,各位转贴别删,劳动成果啊
-------------------------------------------
---
5.请讲一讲析构函数和虚函数的用法和作用。
答:析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。 虚函数是指被关键字 virtual 说明的函数,作用是使用 C++语言的多态特性
6.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的? 答:一些变量在整个程序中都是可见的,它们称为全局变量。一些变量只能在一个函数中可知,称为
局部变量。这就是他们的区别。
在任何函数外面定义的变量就是全局变量,在函数内部定义的变量是局部变量,这是它们在程序中的
实现过程。
操作系统和编译器是根据程序运行的内存区域知道他们的,程序的全局数据放在所分配内存的全局数
据区,程序的局部数据放在栈区。
7.8086 是多少位的系统?在数据总线上是怎么实现的?
答:8086 的机器字长是 16 位,8086 使用 40 个引脚的 16 个做地址/数据复用引腿来传输数据,
一次读写过程由一个基本总线周期完成,它由 4 个时钟(CLK)周期组成,按时间顺序定义为 T1、T2、
T3、T4。在 T1 期间 8086 发出访问目的地的地址信号和地址锁存选通信号 ALE ;T2 期间发出读写
命令信号 RD 、WR 及其它相关信号;T3 期间完成数据的访问;T4 结束该总线周期。可见,地址与
数据信号不会同时出现在一个时钟(CLK)周期,二者可以分时复用同一组引线。
其实今天面试我的技术问题也都是关于 TCP/IP 协议的,谁叫它是做这个的呢。
真正的华为笔试题及我的解答 今天华为打电话说要给我 Offer 了,怎么报答他的 Offer 呢,嗯,
做套真正的华为笔试题吧。特意提到是真正的华为笔试题,是因为前面我做的号称华为笔试题其实是
别人公司的(前面的帖子有解释),下面的内容地球人都说是华为的,难道还不是它的么。哈哈。
这些题目相比其他公司的试题,较为基础,全部为 C 语言,没有涉及 C++,但如果不细心,是很
难得到较高分数的。另外大家转贴不要去掉我的个人信息啊。互相宣传下网站嘛。
1. 找错
void test1()
{
char string[10];
char* str1="0123456789";
strcpy(string, str1);
}
答:表面上并且编译都不会错误。但如果 string 数组原意表示的是字符串的话,那这个赋值就没有
达到意图。最好定义为 char string[11],这样最后一个元素可以存储字符串结尾符'\0'; void test2()
{
char string[10], str1[10];
for(int I=0; I
{
str1[I] ='a';
}
strcpy(string, str1);
}
答:strcpy 使用错误,strcpy 只有遇到字符串末尾的'\0'才会结束,而 str1 并没有结尾标志,导致
strcpy 函数越界访问,不妨让 str1[9]='\0',这样就正常了。
void test3(char* str1)
{
char string[10];
if(strlen(str1)
{
strcpy(string, str1);
}
}
答:这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符'\0'的,如果 str1
刚好为 10 个字符+1 结尾符,string 就得不到结尾符了。可将 strlen(str1)
2. 找错
#define MAX_SRM 256
DSN get_SRM_no()
{
static int SRM_no;
int I;
for(I=0;I
{
SRM_no %= MAX_SRM;
if(MY_SRM.state==IDLE)
{
break;
}
}
if(I>=MAX_SRM)
return (NULL_SRM);
else
return SRM_no;
}
答:我不知道这段代码的具体功能,但明显有两个错误
1,SRM_no 没有赋初值
2,由于 static 的声明,使该函数成为不可重入(即不可预测结果)函数,因为 SRM_no 变量放在
程序的全局存储区中,每次调用的时候还可以保持原来的赋值。这里应该去掉 static 声明。
3. 写出程序运行结果
int sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
int I;
int a=2;
for(I=0;I
{
printf("%d,", sum(a));
}
}
答:8,10,12,14,16
该题比较简单。只要注意 b 声明为 static 静态全局变量,其值在下次调用时是可以保持住
原来的赋
值的就可以。
-------------------------------------------
---
插播广告啦:版权所有:朱科 欢迎光临我的网站:www.goodsoft.cn ,各位转贴别删,劳动成果啊
-------------------------------------------
---
4.
int func(int a)
{
int b;
switch(a)
{
case 1: b=30;
case 2: b=20;
case 3: b=16;
default: b=0;
}
return b;
}
则 func(1)=?
答:func(1)=0,因为没有 break 语句,switch 中会一直计算到 b=0。这是提醒我们不要忘了 break 。
呵呵。
5:
int a[3];
a[0]=0; a[1]=1; a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则 a[q-p]=?
答:a[q-p]=a[2]=2;这题是要告诉我们指针的运算特点
6.
定义 int **a[3][4], 则变量占有的内存空间为:_____
答:此处定义的是指向指针的指针数组,对于 32 位系统,指针占内存空间 4 字节,因此总空间为
3×4×4=48。
7.
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入 2004 年 12 月 31
日 23 时 59 分 59 秒,则输出 2005 年 1 月 1 日 0 时 0 分 0 秒。
答:
/*输入年月日时分秒,输出年月日时分秒的下一秒,输出仍然在原内存空间*/ void NextMinute(int *nYear,int *nMonth,int *nDate,int *nHour,int *nMinute,int *nSecond)
{
int nDays;
(*nSecond)++; // 秒加 1
if(*nSecond>=60) // 秒满 60,做出特殊处理,下面时,日,月等类同 {
*nSecond=0;
(*nMinute)++;
if(*nMinute>=60)
{
*nMinute=0;
(*nHour)++;
if(*nHour>=24)
{
*nHour=0;
(*nDate)++;
switch(*nMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
nDays=31;
break;
case 2:// 判断闰年
if(*nYear%400==0||*nYear%100!=0&&*nYear%4==0)
{
nDays=29;
}
else
{
nDays=28;
}
break;
default:
nDays=30;
break;
}
if(*nDate>nDays)
{
*nDate=1;
(*nMonth)++;
if(*nMonth>12)
{
*nMonth=1;
(*nYear)++;
}
}
}
}
}
}
/*示例可运行代码*/
void main()
{
int nYear=2004,nMonth=12,nDate=31,nHour=59,nMinute=59,nSecond=59; NextMinute(&nYear,&nMonth,&nDate,&nHour,&nMinute,&nSecond); printf("The
result:%d-%d-%d %d:%d:%d",nYear,nMonth,nDate,nHour,nMinute,nSecond); }