华为笔试题大全原版Word下载.docx
《华为笔试题大全原版Word下载.docx》由会员分享,可在线阅读,更多相关《华为笔试题大全原版Word下载.docx(88页珍藏版)》请在冰豆网上搜索。
0.000001&
&
x<
-0.000001)
10.Internet采用哪种网络协议?
该协议的主要层次结构?
Tcp/Ip协议
主要层次结构为:
应用层/传输层/网络层/数据链路层/物理层。
11.Internet物理地址和IP地址转换采用什么协议?
ARP(AddressResolutionProtocol)(地址解析協議)
12.IP地址的编码分为哪俩部分?
IP地址由两部分组成,网络号和主机号。
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。
写出C程序。
循环链表,用取余操作做
14.不能做switch()的参数类型是:
switch的参数不能为实型。
上海华为的一道关于指针方面的编程题
intA[nSize],其中隐藏着若干0,其余非0整数,写一个函数intFunc(int*A,intnSize),使A把0移至后面,非0整数移至
数组前面并保持有序,返回值为原数据中第一个元素为0的下标。
(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
华为笔试题含答案[软件工程题]
写一个程序,要求功能:
求出用1,2,5这三个数不同个数组合的和为100的组合个数。
如:
100个1是一个组合,5个1加19个5是一个组合。
。
请用C++语言写。
A.答案:
最容易想到的算法是:
设x是1的个数,y是2的个数,z是5的个数,number是组合数
注意到0<
=x<
=100,0<
=y<
=50,0<
=z=20,所以可以编程为:
number=0;
for(x=0;
x<
=100;
x++)
for(y=0;
y<
=50;
y++)
for(z=0;
z<
=20;
z++)
if((x+2*y+5*z)==100)
number++;
cout<
<
number<
endl;
上面这个程序一共要循环100*50*20次,效率实在是太低了
B.事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。
我的解法如下:
因为x+2y+5z=100
所以x+2y=100-5z,且z<
=20x<
=100y<
=50
所以(x+2y)<
=100,且(x+5z)是偶数
对z作循环,求x的可能值如下:
z=0,x=100,98,96,...0
z=1,x=95,93,...,1
z=2,x=90,88,...,0
z=3,x=85,83,...,1
z=4,x=80,78,...,0
......
z=19,x=5,3,1
z=20,x=0
因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,
即为:
(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1
某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2
某个奇数m以内的奇数个数也可以表示为(m+2)/2
所以,求总的组合次数可以编程为:
for(intm=0;
m<
m+=5)
{
number+=(m+2)/2;
}
这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多
倍----只是因为作了一些简单的数学分析
这再一次证明了:
计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问
题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种
种限制条件下的最优算法。
而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了
事——这不是一个专业的研发人员的行为。
那么,那种最容易想到的算法就完全没有用吗?
不,这种算法正好可以用来验证新算法
的正确性,在调试阶段,这非常有用。
在很多大公司,例如微软,都采用了这种方法:
在调
试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用
容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保
证是正确的),那么说明优化的算法出了问题,需要修改。
可以举例表示为:
#ifdefDEBUG
intsimple();
#endif
intoptimize();
inafunction:
result=optimize();
ASSERT(result==simple());
这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。
同时,在程
序的发布版本,却不会包含笨重的simple()函数。
——任何大型工程软件都需要预先设计良好的调试手段,而这里提到的就是一种有用的方法。
一个学生的信息是:
姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age,在些链表中删除学生年龄等于age的学生信息。
#include"
stdio.h"
conio.h"
structstu{
charname[20];
charsex;
intno;
intage;
structstu*next;
}*linklist;
structstu*creatlist(intn)
inti;
//h为头结点,p为前一结点,s为当前结点
structstu*h,*p,*s;
h=(structstu*)malloc(sizeof(structstu));
h->
next=NULL;
p=h;
for(i=0;
i<
n;
i++)
{
s=(structstu*)malloc(sizeof(structstu));
p->
next=s;
printf("
Pleaseinputtheinformationofthestudent:
namesexnoage\n"
);
scanf("
%s%c%d%d"
s->
name,&
s->
sex,&
no,&
age);
p=s;
Createsuccessful!
"
return(h);
voiddeletelist(structstu*s,inta)
structstu*p;
while(s->
age!
=a)
s=s->
next;
if(s==NULL)
Therecordisnotexist."
else
next=s->
Deletesuccessful!
voiddisplay(structstu*s)
while(s!
=NULL)
%s%c%d%d\n"
name,s->
sex,s->
no,s->
intmain()
structstu*s;
intn,age;
Pleaseinputthelengthofseqlist:
\n"
%d"
&
n);
s=creatlist(n);
display(s);
Pleaseinputtheage:
deletelist(s,age);
return0;
2、实现一个函数,把一个字符串中的字符从小写转为大写。
voiduppers(char*s,char*us)
for(;
*s!
='
\0'
;
s++,us++)
if(*s>
a'
*s<
z'
)
*us=*s-32;
*us=*s;
*us='
char*s,*us;
charss[20];
Pleaseinputastring:
%s"
ss);
s=ss;
uppers(s,us);
Theresultis:
\n%s\n"
us);
getch();
随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。
不能用字符串库函数
/***************************************************************
1.
函数名称:
Symmetry
功能:
判断一个数时候为回文数(121,35653)
输入:
长整型的数
输出:
若为回文数返回值为1esle0
******************************************************************/
unsignedcharSymmetry(longn)
longi,temp;
i=n;
temp=0;
while(i)//不用出现长度问题,将数按高低位掉换
temp=temp*10+i%10;
i/=10;
return(temp==n);
}
方法一
/*---------------------------------------------------------------------------
判断字符串是否为回文数字
实现:
先将字符串转换为正整数,再将正整数逆序组合为新的正整数,两数相同则为回文数字
char*s:
待判断的字符串
无
返回:
0:
正确;
1: