①华为笔试题搜集
1.static有什么用途?(请至少说明两种)
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用
2.引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
3.描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性。
4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态全局数据段,局部变量在堆栈。
5.什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
6.堆栈溢出一般是由什么原因导致的?
没有回收垃圾资源。
7.什么函数不能声明为虚函数?
constructor函数不能声明为虚函数。
8.冒泡排序算法的时间复杂度是什么?
时间复杂度是O(n^2)。
9.写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)
10.Internet采用哪种网络协议?该协议的主要层次结构?
Tcp/Ip协议
主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。
11.Internet物理地址和IP地址转换采用什么协议?
ARP (Address Resolution Protocol)(地址解析协议)
12.IP地址的编码分为哪俩部分?
IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
循环链表,用取余操作做
14.不能做switch()的参数类型是:
switch的参数不能为实型。
15.上海华为的一道关于指针方面的编程题
int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
②华为最近笔试题目
一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)
1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。( T )
2、int (*ptr) (),则ptr是一维数组的名字。( F )
3、指针在任何情况下都可进行>, <, >=, <=, = =运算。( F )
4、switch(c) 语句中c可以是int, long, char, float, unsigned int 类型。(F )
5、#define print(x) printf("the no, "#x",is ") ( T )
二、填空题(共30分)
1、在windows下,写出运行结果,每空2分,共10分。
char str[ ]= "Hello";
char *p=str;
int n=10;
sizeof(str)=( 6 )
sizeof(p)=( 4 )
sizeof(n)=( 4 )
void func(char str[100])
{ }
sizeof(str)=( 4 )
2、void setmemory(char **p, int num)
{ *p=(char *) malloc(num);}
void test(void)
{ char *str=NULL;
getmemory(&str,100);
strcpy(str,"hello");
printf(str);
}
运行test函数有什么结果?( hello )10分
3、设int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
( 8,8 ) 10分
二、编程题(第一小题20,第二小题30分)
1、 不使用库函数,编写函数int strcmp(char *source, char *dest)
相等返回0,不等返回-1;
- int strcmp(char *source,char *dest)
- {
- if((source == NULL) && (dest == NULL))
- {
- return 0;
- }
- while((*source != '\0') && (*dest != '\0'))
- {
- if(*source != *dest)
- {
- return 1;
- }
- else
- {
- source ++;
- dest ++;
- }
- }
- if((*source == '\0') && (*dest == '\0'))
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
2、 写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1
- int fun(char *p)
- {
- if(p == NULL)
- {
- return -1;
- }
- char *pBegin = p;
- char *pEnd = p;
- while(*pEnd != '\0')
- {
- pEnd ++;
- }
- pEnd --;
- while(pBegin < pEnd)
- {
- if(*pBegin != *pEnd)
- {
- return 0;
- }
- else
- {
- pBegin ++;
- pEnd --;
- }
- }
- return 1;
- }
③华为笔试题含答案 [软件工程题]
写一个程序, 要求功能:求出用1,2,5这三个数不同个数组合的和为100的组合个数。如:100个1是一个组合,5个1加19个5是一个组合。。。。 请用C++语言写。
答案:最容易想到的算法是:
设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<
上面这个程序一共要循环100*50*20次,效率实在是太低了事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。我的解法如下:
因为x+2y+5z=100
所以x+2y=100-5z,且z<=20 x<=100 y<=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,所以,求总的组合次数可以编程为:
number=0;
for (int m=0;m<=100;m+=5)
{
number+=(m+2)/2;
}
cout<这个程序,只需要循环21次, 两个变量,就可以得到答案,比上面的那个程序高效了许多倍----只是因为作了一些简单的数学分析
这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事——这不是一个专业的研发人员的行为。
那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法的正确性,在调试阶段,这非常有用。在很多大公司,例如微软,都采用了这种方法:在调试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保证是正确的),那么说明优化的算法出了问题,需要修改。可以举例表示为:
#ifdef DEBUG
int simple();
#end if
int optimize();
......
in a function:
{
result=optimize();
ASSERT(result==simple());
}
这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。同时,在程序的发布版本,却不会包含笨重的simple()函数。——任何大型工程软件都需要预先设计良
好的调试手段,而这里提到的就是一种有用的方法。
1 一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起, 给出一个age, 在些链表中删除学生年龄等于age的学生信息。
- #include "stdio.h"
- #include "conio.h"
-
-
- struct stu{
- char name[20];
- char sex;
- int no;
- int age;
- struct stu * next;
- }*linklist;
- struct stu *creatlist(int n)
- {
- int i;
-
- struct stu *h,*p,*s;
- h = (struct stu *)malloc(sizeof(struct stu));
- h->next = NULL;
- p=h;
- for(i=0;i
- {
- s = (struct stu *)malloc(sizeof(struct stu));
- p->next = s;
- printf("Please input the information of the student: name sex no age \n");
- scanf("%s %c %d %d",s->name,&s->sex,&s->no,&s->age);
- s->next = NULL;
- p = s;
- }
- printf("Create successful!");
- return(h);
- }
- void deletelist(struct stu *s,int a)
- {
- struct stu *p;
- while(s->age!=a)
- {
- p = s;
- s = s->next;
- }
- if(s==NULL)
- printf("The record is not exist.");
- else
- {
- p->next = s->next;
- printf("Delete successful!");
- }
- }
- void display(struct stu *s)
- {
- s = s->next;
- while(s!=NULL)
- {
- printf("%s %c %d %d\n",s->name,s->sex,s->no,s->age);
- s = s->next;
- }
- }
- int main()
- {
- struct stu *s;
- int n,age;
- printf("Please input the length of seqlist:\n");
- scanf("%d",&n);
- s = creatlist(n);
- display(s);
- printf("Please input the age:\n");
- scanf("%d",&age);
- deletelist(s,age);
- display(s);
- return 0;
- }
2、实现一个函数,把一个字符串中的字符从小写转为大写。
- #include "stdio.h"
- #include "conio.h"
-
-
- void uppers(char *s,char *us)
- {
- for(;*s!='\0';s++,us++)
- {
- if(*s>='a'&&*s<='z')
- *us = *s-32;
- else
- *us = *s;
- }
- *us = '\0';
- }
- int main()
- {
- char *s,*us;
- char ss[20];
- printf("Please input a string:\n");
- scanf("%s",ss);
- s = ss;
- uppers(s,us);
- printf("The result is:\n%s\n",us);
- getch();
- }
随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数
/***************************************************************
1.
函数名称:Symmetry
功能: 判断一个数时候为回文数(121,35653)
输入: 长整型的数
输出: 若为回文数返回值为1 esle 0
******************************************************************/