1、2016校招 华为提前批机试(2015年8月13日上午) 今年的华为机试跟以往的有所不同,以往机试题侧重于字符串处理,分数权重为:60、100、160。今年貌似改革了,题目都偏向数学逻辑类。华为的名言“胜则举杯相庆,败则拼死相救”说话的人来头不小:任正非,顺带说了很欣赏华为的狼性文化,团队精神。 1、猴子吃桃 题目描述: 猴子第一天摘下若干个桃子,当即吃了一半还不过瘾,又多吃了一个。第二天早上有奖剩下的桃子吃掉一般,又多吃了一个。以后每天早上都吃了前一天剩下的一般零一个。到第m天早上再吃时,只剩下一个桃子。求第一天共摘了多少? 输入:mwield天数,即第m早上再想吃时,只剩
2、下一个桃子。 输出:第一天共摘了多少个桃子。 样例输入:2 样例输出:4 答题思路: 从第m天推起,第m天为1个;第m-1天为(1+1)*2个;第m-2天为……以此反推,for循环就可以搞定。 2、海滩上有多少个桃子 题目描述: 海滩上有一堆桃子,只猴子来分。第一只猴子把这堆桃平均分为m份,多了一个,把多的一个扔到海里,拿走了一份。第二只猴子把剩下的桃子又平均分为m份,多了一个,丢入海里,拿走了一份……第三第四……第m只猴字都这样操作,请问海滩上原来最少有多少个桃子? 输入:猴子个数m(3<=m<=9) 输出:原来最少有多少个桃子 样例输入:3 样例
3、输出:25 答题思路: 楼主是暴力求解的,所以效率比较低,i从第1开始,认为最后剩i个,再网上推算,能否被m整除……(最后有一个测试用例没过,仔细想来应该是m=9时,溢出了,因为楼主是先乘后除的,所以问题应该出在这,以后牢记经验了)。 回来后,差了一下猴子分桃这个经典案例,这位大神博客中有写得比较详细和巧妙: 经验教训: 要注意大数问题,像这种情况,long long比较保险一点,另外,做乘除时,能先除的先除,乘放在后面,避免溢出问题!!!!! 2、自动售货系统 题目太长了,直接上图好了 答题思路: 题目很长,但不算难,捋顺了逻辑就
4、好了。楼主后面也有一个测试用例没过,真是伤感。猜测了一下,应该是当输入太长了,自动换行时没有读全…… 经验教训: 以后做题时一定要好好考虑边界、异常等比较全面的测试用例!!!! 华为机试题汇总作者: 刘鹏举 写在前面的话:由于最近准备华为机试,所以在网上找了一些资料,所以以下内容均摘自互联网,现整理一下以供各位找工作的战友参考。肯定不会遇到原题,就当练练手了。 第一题:数组比较: • 问题描述: 比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数 比如
5、 数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0 数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3 • 要求实现函数: int array_compare(int len1, int array1[], int len2, int array2[]) 【输入】 int len1:输入被比较数组1的元素个数; int array1[]:输入被比较数组1; int len2:输入被比较数组2的元素个数; int array2[]:输入被比较数组2; 【输出】 无 【返回】 不相等元素的个
6、数,类型为int • 示例 1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5 函数返回:0 2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6 函数返回:3 第二题:约瑟夫环(学软件的这个都应该知道) • 问题描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,
7、将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序 比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数 第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数 第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数 最后一轮计数出
8、列数字为4,计数过程完成。 输出数值出列顺序为:2,3,1,4。 • 要求实现函数: void array_iterate(int len, int input_array[], int m, int output_array[]) 【输入】 int len:输入数列的长度; int intput_array[]:输入的初始数列 int m:初始计数值 【输出】 int output_array[]:输出的数值出列顺序 【返回】 无 • 示例 输入:int input_array[] = {3,1,2,4},int len = 4, m=7 输出:output
9、array[] = {2,3,1,4} 第三题:四则运算: • 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3、要考虑加减乘除按通常四则运算规定的计算优先级 4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生 5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况 • 要求实现函数:
10、 int calculate(int len,char *expStr) 【输入】 int len: 字符串长度; char *expStr: 表达式字符串; 【输出】 无 【返回】 计算结果 • 示例 1) 输入:char *expStr = “1+4*5-8/3” 函数返回:19 2) 输入:char *expStr = “8/3*3” 函数返回:6 : 第四题: 单链表逆序(这个大家都懂得) 第五题:编写函数string deletestring(string str,string sub_str)从str中查找匹配的字符串sub_str,采用最
11、左匹配,且输出形式为str+"_"+匹配的次数: 第六题:高精度数相加,string addBigInt(string num1,string num2)需考虑正负数相加 第七题:比较一个数组的元素 是否为回文数组 第八题:求两个整形数组的异集,接A+B-(A与B的交集) 第九题:一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带一对 3:三条带两张不相同数值的牌 4:两对 5:顺子 包括 10,J,Q,K,A 6:什么都不是 7:只有一对 第十题:手机号码合法性判断(20分) 问题描述:
12、 我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下: 1、 长度13位; 2、 以86的国家码打头; 3、 手机号码的每一位都是数字。 请实现手机号码合法性判断的函数要求: 1) 如果手机号码合法,返回0; 2) 如果手机号码长度不合法,返回1 3) 如果手机号码中包含非数字的字符,返回2; 4) 如果手机号码不是以86打头的,返回3; 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。 要求实现函数: int s int v
13、erifyMsisdn(char* inMsisdn) 【输入】 char* inMsisdn,表示输入的手机号码字符串。 【输出】 无 【返回】 判断的结果,类型为int。 示例 输入: inMsisdn = “869123456789“ 输出: 无 返回: 1 输入: inMsisdn = “88139123456789“ 输出: 无 返回: 3 输入: inMsisdn = “86139123456789“ 输出: 无 返回: 0 第十一题:将一个字符串的元音字母复制到另一个字符串,并排序(30分) 问题描述: 有一字符串,里面可能包
14、含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。 说明: 1、 元音字母是a,e,i,o,u,A,E,I,O,U。 2、 筛选出来的元音字母,不需要剔重; 最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。 要求实现函数: void sortVowel (char* input, char* output); 【输入】 char* input,表示输入的字符串 【输出】 char* outp
15、ut,排好序之后的元音字符串。 【返回】 无 示例 输入:char *input = “Abort!May Be Some Errors In Out System. “ 输出:char *output =“aeeeooAEIO “ 第十二题:身份证号码合法性判断 问题描述: 我国公民的身份证号码特点如下: 1、 长度为18位; 2、 第1~17位只能为数字; 3、 第18位可以是数字或者小写英文字母x。 4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。 例如:511002 19880808 0111或511002
16、19880808011x。 请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。 函数返回值: 1) 如果身份证号合法,返回0; 2) 如果身份证号长度不合法,返回1; 3) 如果身份证号第1~17位含有非数字的字符,返回2; 4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3; 5) 如果身份证
17、号的年信息非法,返回4; 6) 如果身份证号的月信息非法,返回5; 7) 如果身份证号的日信息非法,返回6(请注意闰年的情况); 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。 要求实现函数: int verifyIDCard(char* input) 示例 1) 输入:”511002 111222”,函数返回值:1; 2) 输入:”511002 abc123456789”,函数返回值:2; 3) 输入:”511002 19880808123a”,函数返回值:3; 4) 输入:”511
18、002 188808081234”,函数返回值:4; 5) 输入:”511002 198813081234”,函数返回值:5; 6) 输入:”511002 198808321234”,函数返回值:6; 7) 输入:”511002 1989 0229 1234”,函数返回值:7; 8) 输入:”511002 198808081234”,函数返回值:0; 第十三题:选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type == 1,表示专家评委,judge_type =
19、 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。 函数接口 int cal_score(int score[], int judge_type[], int n) 第十四题:给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间
20、两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。 例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1}; input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3} 函数接口 void sort(int input[[, int n, int output[]) 第十五题:操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 5
21、0且 <= 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}
22、 user_task[] = {4, 8, 2, 6, -1} 函数接口 void scheduler(int task[], int n, int system_task[], int user_task[]) 2015届华为校园招聘机试题 分类: 面试珠玑2014-09-13 18:25 19022人阅读 评论(26) 收藏 举报 华为机试 第一题(60分): 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”
23、12345678“,”90000000”
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include
24、解的个数 10. remainder = len - n * quotient; //剩余的字符串的个数 11. 12. for(i = 0 ; i < len ; i += n) 13. { 14. if(len - i < n) 15. { 16. k = n - len + i; 17. for(j = i ; j < len ; ++j) 18. printf("%c" , str[j
25、]); 19. for(j = 0 ; j < k ; ++j) 20. putchar('0'); 21. } 22. else 23. { 24. for(j = i ; j < i + n ; ++j) 25. printf("%c" , str[j]); 26. } 27. putchar(' '); 28. } 29.
26、 printf("\n"); 30. } 31. 32. int main(void) 33. { 34. int i , m , n , len; 35. char str[1000]; 36. 37. while(scanf("%d %d", &m , &n) != EOF) 38. { 39. for(i = 0 ; i < m ; ++i) 40. { 41. scanf("%s" , str); 42.
27、 len = strlen(str); 43. solve(str , n , len); 44. } 45. } 46. return 0; 47. } 第一题:拼音转数字 输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下: 描述: 拼音 yi er san si wu liu qi ba jiu 阿拉伯数字 1 2 3 4 5 6 7 8 9 输入字符
28、只包含小写字母,所有字符都可以正好匹配
运行时间限制:无限制
内存限制: 无限制
输入: 一行字符串,长度小于1000
输出: 一行字符(数字)串
样例输入: yiersansi
样例输出: 1234
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include
29、r , int len) 7. { 8. int i; 9. 10. for(i = 0 ; i < len ; ) 11. { 12. switch(str[i]) 13. { 14. case 'y': 15. putchar('1'); 16. i += 2; 17. break; 18. case 'e': 19. putch
30、ar('2'); 20. i += 2; 21. break; 22. case 's': 23. if(str[i + 1] == 'a') 24. { 25. putchar('3'); 26. i += 3; 27. } 28. else 29. { 30.
31、 putchar('4'); 31. i += 2; 32. } 33. break; 34. case 'w': 35. putchar('5'); 36. i += 2; 37. break; 38. case 'l': 39. putchar('6'); 40. i += 3; 41.
32、 break; 42. case 'q': 43. putchar('7'); 44. i += 2; 45. break; 46. case 'b': 47. putchar('8'); 48. i += 2; 49. break; 50. case 'j': 51. putchar('9');
33、 52. i += 3; 53. break; 54. } 55. } 56. printf("\n"); 57. } 58. 59. int main(void) 60. { 61. int len; 62. char str[1000]; 63. 64. while(scanf("%s" , str) != EOF) 65. { 66. len = strlen(str);
34、
67. solve(str , len);
68. }
69. return 0;
70. }
第二题:去除重复字符并排序
运行时间限制:无限制
内容限制: 无限制
输入: 字符串
输出: 去除重复字符并排序的字符串
样例输入: aabcdefff
样例输出: abcdef
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include
35、cstdio>
4. #include
36、ash[str[i]] = 1; 16. } 17. for(i = 0 ; i < 256 ; ++i) 18. { 19. if(0 != hash[i]) 20. putchar(i); 21. } 22. printf("\n"); 23. } 24. 25. int main(void) 26. { 27. int len; 28. char str[1000]; 29. 30. whil
37、e(scanf("%s" , str) != EOF) 31. { 32. len = strlen(str); 33. solve(str , len); 34. } 35. return 0; 36. } 第三题:等式变换 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。 1 2 3 4 5 6 7 8 9 = X 比如: 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 = 5 请编写程序,统计满足输入整数的所有整数个数。 输入:
38、 正整数,等式右边的数字
输出: 使该等式成立的个数
样例输入:5
样例输出:21
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include
39、 int currentResult, int lastOp, int lastSum) 11. { 12. lastSum *= (layer > 9) ? 100 : 10; 13. lastSum += layer; 14. if(layer == 9) 15. { 16. currentResult += (lastOp) ? (-1 * lastSum) : lastSum; 17. if(currentResult == result) 18. {
40、19. ++num; 20. printf("1"); 21. for(int i = 2 ; i <= 9 ; ++i) 22. { 23. if(sym[ops[i-1]] != ' ') 24. printf(" %c ", sym[ops[i-1]]); 25. printf("%d", i); 26. } 27.
41、 printf(" = %d\n" , result); 28. } 29. return; 30. } 31. ops[layer] = 2; 32. dfs(layer + 1 , currentResult , lastOp , lastSum); //Continue 33. currentResult += (lastOp)? (-1 * lastSum) : lastSum; 34. ops[layer] = 0; 35. dfs(
42、layer + 1 , currentResult , 0 , 0); //Plus 36. ops[layer] = 1; 37. dfs(layer + 1 , currentResult , 1 , 0); //Minus 38. } 39. 40. int main(void) 41. { 42. while(scanf("%d", &result) != EOF) 43. { 44. num = 0; 45. dfs(1 , 0 , 0 , 0);
43、46. printf("%d\n" , num); 47. } 48. return 0; 49. } 华为2016校招机试题 分类: C/C++ 算法 C/C++笔试题目2015-09-05 23:02 62人阅读 评论(1) 收藏 举报 目录(?)[+] 题目一:根据指定的分隔符分隔字符串,并输出指定的段 描述 根据指定的分隔符分隔字符串,并输出指定的段。如果指定的段超过分隔的段数,输出:NULL 举例: AAA?BBB?CCC??2 字符串为:AAA?BBB?CCC? 分隔符为:? 指定的段
44、为:2
字符串分割为:AAA BBB CCC共三段,第2段字符串为:BBB
输入输出格式要求
输入分隔字符串长度小于128个字符,指定的段是一个正整数。
样例
输入:AAA?BBB?CCC??2
输出:BBB
[cpp] view plaincopy
1. #include
45、 char* strTmp = str; 10. char *strStart = strchr(strTmp, '?'); 11. strStart++; 12. char *strEnd = strchr(strStart, '?'); 13. int len = strEnd - strStart; 14. while(len != 0){ 15. cout<<*strStart; 16. strStart++; 17. len--; 1
46、8. }
19. cout< 47、输入:2,4,6,8,10,12,3,9
输出:4,6,8,10,12,9
[cpp] view plaincopy
1. #include 48、 a[i] = tempIn;
12. i++;
13. scanf("%c",&c);;
14. }
15. i--;
16. k = 0;
17. while(i > 0){
18. for(int j = 0; j < i; j++){
19. if(a[i] % a[j] == 0){
20. b[k] = a[i];
21. k++;
22. 49、 break;
23. }
24. }
25. i--;
26. }
27. for(int j = k-1; j >= 0; j--){
28. cout<






