我来说说华为机试
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
受乔哥的启发,决定写一个关于华为机试的简介,首先声明本人并非大牛,也无权拿到华为的内部资料,以下内容大部分源自网络,还有一部分是自己的感悟,本文以整理和疏导为主。
由于我不会JAVA,在这也就不写JAVA的东西了吧,下面的内容以C/C++为主。
分为几个部分:第一部分是华为机试流程、题型等相关介绍,第二部分是一些经典题目的剖些,第三部分是一些提示和建议。
一、华为机试介绍
2.考试说明
这里有一个老版的机试考试说明,供大家参考:
C/C++,JAVA机试流程:
①打开IE浏览器,输入机试系统IP地址(以当天告知的地址为准);
②输入姓名、手机,选择“C/C++”或“JAVA”,登录;
③登录后显示题目,阅读题目并点击页面最下方“下载框架文件”,将文件解压到D盘;
④用VC6.0或Eclipse打开工程工程;
⑤补充函数体、调试;
⑥将工程压缩打包;
⑦返回IE浏览器中的试题页面,点击最下方的“提交”按钮,完成提交。
3.注意事项
华为的机试阅卷为电脑自动阅卷,大致流程是输入测试数据,判断结果是否正确,所以,在编写好程序后,一定要多测试几组数据,至少要保证题目中测试数据输入后,结果符合题目要求。
二、经典题目剖析
1.在分析具体题目之前,有几个注意事项说一下:
1)同学们平时写代码的编译环境不太一样,大致有GCC/G++,VC,VS,在这几种之中又细分了好多个版本,但是既然是准备华为机试,那么就装个最简单的VS2005吧,只要代码在这个版本上通过,相信机试的时候也不会出问题。
2)现在很多新旧编程标准交织,这几年还有很实用的C++11,但是为了机试,这些还是先别秀吧,你问为什么有这么好的东西却不让用?因为VS2005不支持呗,类似的还有atoi(), itoa() 这些局限于编译环境的函数也最好别用。
2.机试的时候分为3类题:
3)初级题——多为简单字符串处理或数字操作
4)中级题——在考察编程语言能力的基础上加入一定简单的算法和数据结构。
5)高级题——更多的算法和数据结构要求,代码量明显增大,栈、图、树、查找、搜索都在考察范围内。
3.具体题目(以下所有代码本人均在VS2005环境上编译测试通过)
1)排序方法总结
题1:
排序是编程语言里最基本的方法,目前典型的排序方法有:冒泡排序、快速排序、选择排序、简单插入排序、二分插入排序、希尔排序、归并排序等。既然是基础,那么就必然要了然于心。
代码见:1.cpp(打开:Ctrl + 鼠标左键点击)
排序算法这么多,比较麻烦,但是思想一定要了然于心,说不定面试的时候就会让你写个排序算法看看呢?但是如果我们只是在程序中用到一个排序的功能,大可不必话费很长的时间去写这些排序算法,C++中给出了一个sort函数,非常方便,大家可以去了解一下,因为使用起来非常简单,并且在接下来的题目中会用到,在这就不多讲了。
题2:
输入10个数字,按各个位上的和从小到大排序,如果相同,则按数字从小到大排序。
输入描述: 10个正整数,保证都在int范围内,用空格隔开
输出描述: 10个数字,其从大到小的值,用空格隔开,最后一个数字后不加空格
输入样例11 3 2 4 5 9 8 7 10 6
输出样例10 2 11 3 4 5 6 7 8 9
代码见:2.cpp
题3:
操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级< 50,用户任务的优先级>= 50且<= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到system_task[] 数组和user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}
代码见:3.cpp
题4:
输入一组身高在170到190之间(5个身高),比较身高差,选出身高差最小的两个身高;若身高差相同,选平均身高高的那两个身高;从小到大输出;
如:输入170 181 173 186 190 输出170 173
代码见:4.cpp
2)求最大、最小数
题5:
输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;数组的长度不超过50。
代码见:5.cpp
题6:
输入一串字符,只包含“0-10”和“,”找出其中最小的数字和最大的数字(可能不止一个),输出最后剩余数字个数。
代码见:6.cpp
相信通过题2、题3,在找最大、最小数时,不论是数组还是字符类型都可以轻松应对了。
3)链表
题7:
一组人(7个),围成一圈,从某人开始数到第3个的人出列,再接着从下一个人开始数,依次输出
出列的人。(报数:共n个人从1编号,设从第s个人报号,报到m出队,依次输出出队的人。)代码见:7.cpp
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,这题既可以使用循环列表又可以使用数组在程序中两种方法都罗列了。
题8:
出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现。
代码见:8.cpp
如果这题能够轻松地写出,那么单项列表的知识就算是基本掌握了。
4)大数、高精度数运算。
题9:
求两个长长整型的数据的和并输出。
代码见:9.cpp
题10:
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。
如下:9876543210 + 1234567890 = ?让字符串num1="9876543210",字符串num2="1234567890",结果保存在字符串result = "11111111100"。
-9876543210 + (-1234567890) = ?让字符串num1="-9876543210",字符串num2="-1234567890",结果保存在字符串result = "-11111111100"。要求编程实现上述高精度的十进制加法。
代码见:10.cpp
上面两题,分别实现了正大数的加运算,大数的加运算,相信完全吃透后再编写大数运算的程序就不是问题了。
题11:
输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果。
代码见:11.cpp
5)字符串常见操作
题12:
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。比如字符串“abacacde”过滤结果为“abcde”。
代码见:12.cpp
题13:
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
代码见:13.cpp
题14:
删除子串,只要是原串中有相同的子串就删掉,不管有多少个都删除,返回子串个数。
输入字符串为:123abc12de234fg1hi34j123k,子串为:123