上海华为研究所面试参考题

这是开发人员的参考题目,您可以看一下:

1.请给出如下这段程序的结果,该程序运行在32位x86体系cpu上(程序以斜体字给出)

#include "stdafx.h"

#include "string.h"

char a[]={"abcdef"};

char b[]={'a','b','c','d','e','f'};

union

{

struct

{

unsigned s1:2;

unsigned s2:3;

unsigned s3:3;

}t;

char d;

}s;

char *pta = (char *)0x1200;

char *ptb = (char *)0x1218;

int _tmain(int argc, _TCHAR* argv[])

{

s.d = 100;

printf("%d %d %d %d %d %d\n",strcmp(a,b),sizeof(a),strlen(a),sizeof(s),

s.t.s3,(ptb-pta));

return 0;

}

答案:0 7 6 4 3 24

分析:

答案中

第一个0说明两个字符数组相同。这里主要考点在于要应试者知道strcmp这一常用的

ANSI C库函数的输出,如果两个字符串相等,输出应该是0。

第二个7以及第三个6主要是要应试者分清楚编译器对于字符串数组的大小(容量)是包

含结束符’0x0’的,而strlen是不包含结束符’0x0’的。

第四个4是要检查应试者对于联合的理解,通常在默认情况下,32位cpu(编译器)默认的

对齐方式是字对齐,就是按32位来对齐,因此看联合s中有一个是位域的unsigned,还

有一个是char,取容量(占得多)的一个就是unsigned为该联合的大小(sizeof)。

第五个3主要考位域概念,而且考cpu字节序。位域s经过s.d=100这样的赋值后,在x86

32位体制下内存(或寄存器)中的二进制表示为01100100 00000000 00000000 00000000,因此s.t.s3是0b111,s.t.s2是0b001,s.t.s1是0b00,这里应用的是x86小

头序。注意位域定义是不能跨字节的,但是这个题目没有出跨字节的位域。

第六个24是考指针概念,两个指针相减,得指针之间的偏移量。

2.临界区是指什么?有什么作用?

分析:

要注意临界区是用来进行同一进程下线程同步的。一般来说linux不提临界区概念,因

为pthread库中没有critical section这种东西,linux用互斥和信号量实现类似临界区

的用途。临界区是用户态下的操作,轻量级的。简单的讲,如果有些代码存在竞争资

源,比如多个线程对某个变量都有读写要求,则读写的代码可以用临界区保护起来。有

关内容还可以到网上进一步看看。

3.对于改错题,请注意以下要点

1)变量是否初始化过?如果没初始化,则结果都是不可预期的,都有问题

2)是否有溢出,最典型的例子就是定义一个char型的循环变量,然后循环条件设置为

i<256,那么这是个死循环,因为i是0到255

3)宏定义中的计算是否两端都加括号了,以避免宏被其他宏引用带来的优先级问题

4)i++ ++i的区别

4.编程题

1)、将数组int a[10]与数组int b[10]中相同的数据,放入数组int c[]中;不同的数

据,放入数组int d[]中。

2)、编写函数,将数据链表中,指定的数据的结点删除。

3)、数的遍历,把中序/前序/后序遍历的定义看看清楚,给一棵树可以写出不同遍历

方法下的遍历结果;用递归的方法实现某一种遍历

祝您面试顺利!

 

第二篇:上海华为面试总结

1,++i和i++ 区别

++i 先自增再参与运算,i++先参与运算再自增

2,makefile文件代码,写代码

test : main.o add.o

gcc main.o add.o -o test

main.o : main.c add.h

gcc -c main.c -o main.o

add.o : add.c add.h

gcc -c add.c -o add.o 3,隐藏与重写的区别

隐藏是指当父类和子类有相同名字的属性的时候,父类的同名变量形式上不可见了。但是实际还是存在的。

譬如A有int变量a = 10,父类B有变量a = 5;

当B b = new A()得时候,若用b.a 那么父类的5就被隐藏了,此时b.a = 子类的10。在子类里面访问super.a得时候只能得到子类的值

重写是针对方法的,通常是父类的方法在子类中重新写过。当执行子类的实例得时候,实际运行的是子类的方法。在子类里面可以通过super.method()来显式的访问。

4,linux 基本命令使用 如:如何查询帮助文档(man),如何查处文件(fiind),常用命令 Linux常用命令全集.CHM 5,进程间通信有几种,效率如何

# 管道( pipe ):

管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

# 有名管道 (named pipe) :

有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

# 信号量( semophore ) :

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

# 消息队列( message queue ) :

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

# 信号 ( sinal ) :

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

# 共享内存( shared memory ) :

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

# 套接字( socket ) :

套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

6,tcp/ip 有几层

TCP/IP层次模型共分为四层:应用层、传输层、网络层、数据链路层。 应用层—应用层是所有用户所面向的应用程序的统称。ICP/IP协议族在这一层面有着很多协议来支持不同的应用,许多大家所熟悉的基于Internet的应用的实现就离不开这些协议。如我们进行万维网(WWW)访问用到了HTTP协议、文件传输用FTP协议、电子邮件发送用SMTP、域名的解析用DNS协议、远程登录用Telnet协议等等,都是属于TCP/IP应用层的;就用户而言,看到的是由一个个软件所构筑的大多为图形化的操作界面,而实际后台运行的便是上述协议。

* 传输层—这一层的的功能主要是提供应用程序间的通信,TCP/IP协议族在这一层的协议有TCP和UDP。

* 网络层—是TCP/IP协议族中非常关键的一层,主要定义了IP地址格式,从而能够使得不同应用类型的数据在Internet上通畅地传输,IP协议就是一个网络层协议。

* 网络接口层—这是TCP/IP软件的最低层,负责接收IP数据包并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层

7,p2p 和SMTP分别在哪层

P2p(点对点传输协议)在传输层

SMTP(邮件传输协议)在应用层

8,多态概念(父类引用子类参数)

对于多态,可以总结它为:

一、使用父类类型的引用指向子类的对象;

二、该引用只能调用父类中定义的方法和变量;

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

3.1 java中实现多态的机制是什么? 1. 方法的重写Overriding和重载Overloading是Java

多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载

Overloading是一个类中多态性的一种表现。

9,java 写1+N的和

10,数据结构与算法 如 排序,二叉树

上海华为面试总结

11,MVC概念(为什么有DAO层,什么作用)

MVC(Model-View-Controller,模型-视图-控制器模式)是软件工程中的一种软件架构模式。它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。三层架构是最基本的项目分层结果,而MVC则是三层架构的一个变体,MVC是一种好的开发模式。首先你要明白MVC分别代表的是什么意思.

M 即Model(模型层),主要负责出来业务逻辑以及数据库的交互

V 即View(视图层),主要用于显示数据和提交数据

C 即Controller(控制器),主要是用作捕获请求并控制请求转发

三层:UI 界面层 BLL 业务逻辑层,DAL数据访问层,Model 实体层

MVC中的的M 不是三层中的Model(实体层),他其实包括三层中的 BLL,DAL,Model,这

是非常要注意的,这也是他们之间的区别的关键所在

其有点有如下:

低耦合性

高重用性和可适用性

较低的生命周期成本

快速的部署

可维护性

有利于软件工程化管理

当然优点也有缺点,那就是内部结构复杂,不容易理解,文件数量大,管理难度自然也就大 MVC设计模式…

三层架构…

他们细分之后得到的是:View(UI)、BIZ(BLL)、DAO(DAL)、Entity(Model)、Controller MVC把 BIZ(BLL)、DAO(DAL)、Model(Entity) 统一称之为 模型(MODEL),得到:View、Controller、模型(MODEL)

三层 在我使用中 暂未体会到控制器的存在,完全是:UI、DAO、BLL

他们相同的设计理念就是:把视图设计与数据持久化进行分离,从而降低耦合性,易于扩展,提高团队开发效率。

12,GC回收机制

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理

的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。

由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用

才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存

堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的

调用垃圾回收器对某个对象或所有对象进行垃圾回收。

回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收

1. 垃圾回收具有以下优点: i.把程序从复杂的内存跟踪、监测和释放等的工作中解放

出来,减轻程序员进行内存管理的负担。ii.防止系统内存被非法释放,从而使系

统更加健壮和稳定。2. 垃圾回收具有以下特点: i.只有当对象不再被程序中的任

何引用变量引用时,它的内存才可能被释放。ii.程序无法迫使垃圾回收器立即执

行垃圾回收操作。iii. 当垃圾回收器将要回收无用对象的内存时,先调用该对象

的finalize()方法,该方法有可能使对象复活,导致垃圾回收器取消回收该对象的

内存

13,android项目 自述

14,java 的进程与线程维护

15,N*N 打印出来的样子是(例如 N=4) 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 解答:

1 #define N 15

int s[N][N];

void main()

{

int k = 0, i = 0, j = 0;

int a = 1;

for( ; k < (N+1)/2; k++ )

{

while( j < N-k ) s[i][j++] = a++; i++; j--;

while( i < N-k ) s[i++][j] = a++; i--; j--;

while( j > k-1 ) s[i][j--] = a++; i--; j++;

while( i > k ) s[i--][j] = a++; i++; j++;

}

for( i = 0; i < N; i++ )

{

for( j = 0; j < N; j++ )

cout << s[i][j] << '\t';

cout << endl;

}

}

2 define MAX_N 100

int matrix[MAX_N][MAX_N];

/*

*(x,y):第一个元素的坐标

* start:第一个元素的值

* n:矩阵的大小

*/

void SetMatrix(int x, int y, int start, int n) {

int i, j;

if (n <= 0) //递归结束条件

return;

if (n == 1) { //矩阵大小为1时

matrix[x][y] = start;

return;

}

for (i = x; i < x + n-1; i++) //矩阵上部

matrix[y][i] = start++;

for (j = y; j < y + n-1; j++) //右部

matrix[j][x+n-1] = start++;

for (i = x+n-1; i > x; i--) //底部

matrix[y+n-1][i] = start++;

for (j = y+n-1; j > y; j--) //左部

matrix[j][x] = start++;

SetMatrix(x+1, y+1, start, n-2); //递归

}

void main() {

int i, j;

int n;

scanf("%d", &n);

SetMatrix(0, 0, 1, n);

//打印螺旋矩阵

for(i = 0; i < n; i++) {

for (j = 0; j < n; j++)

printf("%4d", matrix[i][j]);

printf("\n");

}

}

16,linux 末行,输入,命令三个模式

vi编辑器有3种模式:命令模式、输入模式、末行模式。掌握这三种模式十分重要: 命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。在命令模式中输入字幕“i”就可以进入vi的输入模式编辑文件。

输入模式:在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“--INSERT--”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。

末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。 17,android 四层架构分别的作用(android系统框图)

架构框架以此从上到下:

1.Applications (应用程序(应用层));

2.Application FrameWork (应用程序扩展层(框架));

3.Android RunTime Libraries (Android 系统运行库);

4.Liunx Kernel (Android 系统最底层核心系统 Liunx)

18,android四大组件,生命周期,onpause()与onstop()的区别

Activity

Service

Broadcast Receiver

Content Provider

Content Provider

创建 oncreate - 启动onstart – 恢复 onResume – 暂停 onPause – 结束 onEnd – 销毁onDestroy

onPause 用于由一个Activity转到另一个Actividy,此时用于第一个Activity

onStop 用于不可见的Activity

19,UMI建模概念 基软件工程的UMI,建模技术分析 UML这三个字母的全称是Unified Modeling Language,即统一建模语言,简单地说就是一种有特殊用途的语言。其实有很多内容文字是无法表达的。比如建筑界有一套标准来描述,来辅助表达清楚建筑的设计,就是建筑设计图纸。同样的情况在软件开发过程中,特别是当前的数据库看软件工程方面,也需要一套标准来辅助软件开发工作。UML就是其中的一种标准,(注意并不是唯一标准.只是!JML是比较推崇的一种标准)虽然UML并不是官方的标准,也没有法律规定在软件开发中一定要用UML,但是通过妥善使用UML在内的各种标准,往往能够提高软件开发的水平。UML可以实现大型复杂系统各种成分描述的可视化、说明并构造系统模型,以及建立各种所需的文档,它是一种定义良好、易于表达、功能强大且普遍适用的建模语言。 现代的软柞开发采用面向对象的观点进行建模.按照这种方法,所有软件系统都用对象或类作为其主要构造块。

对象通常是从问题空间或解空间的词汇中抽取出来的东西;类是对具有共同性质的一组对象(从建模者的视角)的描述.而UML正式这种面向对象统一建模的方法。UML合并了许多面向对象方法中被普遍接受的概念,对每一种概念它都给出了清晰的定义、表示法和有关术语.使用U呱可以对己有的用各种方法建立的模型进行描述,并比原来的方法描述得更好.

20.说出ArrayList,Vector, LinkedList的存储性能和特性

1.ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以

便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

相关推荐