资源描述
2016校招 华为提前批机试(2015年8月13日上午)
今年的华为机试跟以往的有所不同,以往机试题侧重于字符串处理,分数权重为:60、100、160。今年貌似改革了,题目都偏向数学逻辑类。华为的名言“胜则举杯相庆,败则拼死相救”说话的人来头不小:任正非,顺带说了很欣赏华为的狼性文化,团队精神。
1、猴子吃桃
题目描述:
猴子第一天摘下若干个桃子,当即吃了一半还不过瘾,又多吃了一个。第二天早上有奖剩下的桃子吃掉一般,又多吃了一个。以后每天早上都吃了前一天剩下的一般零一个。到第m天早上再吃时,只剩下一个桃子。求第一天共摘了多少?
输入:mwield天数,即第m早上再想吃时,只剩下一个桃子。
输出:第一天共摘了多少个桃子。
样例输入:2
样例输出:4
答题思路:
从第m天推起,第m天为1个;第m-1天为(1+1)*2个;第m-2天为……以此反推,for循环就可以搞定。
2、海滩上有多少个桃子
题目描述:
海滩上有一堆桃子,只猴子来分。第一只猴子把这堆桃平均分为m份,多了一个,把多的一个扔到海里,拿走了一份。第二只猴子把剩下的桃子又平均分为m份,多了一个,丢入海里,拿走了一份……第三第四……第m只猴字都这样操作,请问海滩上原来最少有多少个桃子?
输入:猴子个数m(3<=m<=9)
输出:原来最少有多少个桃子
样例输入:3
样例输出:25
答题思路:
楼主是暴力求解的,所以效率比较低,i从第1开始,认为最后剩i个,再网上推算,能否被m整除……(最后有一个测试用例没过,仔细想来应该是m=9时,溢出了,因为楼主是先乘后除的,所以问题应该出在这,以后牢记经验了)。
回来后,差了一下猴子分桃这个经典案例,这位大神博客中有写得比较详细和巧妙:
经验教训:
要注意大数问题,像这种情况,long long比较保险一点,另外,做乘除时,能先除的先除,乘放在后面,避免溢出问题!!!!!
2、自动售货系统
题目太长了,直接上图好了
答题思路:
题目很长,但不算难,捋顺了逻辑就好了。楼主后面也有一个测试用例没过,真是伤感。猜测了一下,应该是当输入太长了,自动换行时没有读全……
经验教训:
以后做题时一定要好好考虑边界、异常等比较全面的测试用例!!!!
华为机试题汇总作者: 刘鹏举
写在前面的话:由于最近准备华为机试,所以在网上找了一些资料,所以以下内容均摘自互联网,现整理一下以供各位找工作的战友参考。肯定不会遇到原题,就当练练手了。
第一题:数组比较:
• 问题描述:
比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数
比如:
数组{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;
【输出】 无
【返回】 不相等元素的个数,类型为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后,将数列该位置数值替换计数值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所在位置开始计数
最后一轮计数出列数字为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_array[] = {2,3,1,4}
第三题:四则运算:
• 问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
• 要求实现函数:
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,采用最左匹配,且输出形式为str+"_"+匹配的次数:
第六题:高精度数相加,string addBigInt(string num1,string num2)需考虑正负数相加
第七题:比较一个数组的元素 是否为回文数组
第八题:求两个整形数组的异集,接A+B-(A与B的交集)
第九题:一副牌中发五张扑克牌给你:让你判断数字的组成:
有以下几种情况:
1:四条:即四张一样数值的牌(牌均不论花色)
2:三条带一对
3:三条带两张不相同数值的牌
4:两对
5:顺子 包括 10,J,Q,K,A
6:什么都不是
7:只有一对
第十题:手机号码合法性判断(20分)
问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
1、 长度13位;
2、 以86的国家码打头;
3、 手机号码的每一位都是数字。
请实现手机号码合法性判断的函数要求:
1) 如果手机号码合法,返回0;
2) 如果手机号码长度不合法,返回1
3) 如果手机号码中包含非数字的字符,返回2;
4) 如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int s int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】 无
【返回】 判断的结果,类型为int。
示例
输入: inMsisdn = “869123456789“
输出: 无
返回: 1
输入: inMsisdn = “88139123456789“
输出: 无
返回: 3
输入: inMsisdn = “86139123456789“
输出: 无
返回: 0
第十一题:将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 筛选出来的元音字母,不需要剔重;
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数:
void sortVowel (char* input, char* output);
【输入】 char* input,表示输入的字符串
【输出】 char* output,排好序之后的元音字符串。
【返回】 无
示例
输入: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 19880808011x。
请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。
函数返回值:
1) 如果身份证号合法,返回0;
2) 如果身份证号长度不合法,返回1;
3) 如果身份证号第1~17位含有非数字的字符,返回2;
4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5) 如果身份证号的年信息非法,返回4;
6) 如果身份证号的月信息非法,返回5;
7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyIDCard(char* input)
示例
1) 输入:”511002 111222”,函数返回值:1;
2) 输入:”511002 abc123456789”,函数返回值:2;
3) 输入:”511002 19880808123a”,函数返回值:3;
4) 输入:”511002 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 == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。
函数接口 int cal_score(int score[], int judge_type[], int n)
第十四题:给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
例如: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,用户任务的优先级 >= 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}
函数接口 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”,“12345678“,”90000000”
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include<iostream>
3. #include<cstdio>
4. using namespace std;
5.
6. void solve(char *str , int n , int len)
7. {
8. int i , j , k , quotient , remainder;
9. quotient = len / n; //原字符串被分解的个数
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]);
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. 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. 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
输入字符只包含小写字母,所有字符都可以正好匹配
运行时间限制:无限制
内存限制: 无限制
输入: 一行字符串,长度小于1000
输出: 一行字符(数字)串
样例输入: yiersansi
样例输出: 1234
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include<iostream>
3. #include<cstdio>
4. using namespace std;
5.
6. void solve(char *str , 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. putchar('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. 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. 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');
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);
67. solve(str , len);
68. }
69. return 0;
70. }
第二题:去除重复字符并排序
运行时间限制:无限制
内容限制: 无限制
输入: 字符串
输出: 去除重复字符并排序的字符串
样例输入: aabcdefff
样例输出: abcdef
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include<iostream>
3. #include<cstdio>
4. #include<memory>
5. using namespace std;
6.
7. void solve(char *str , int len)
8. {
9. int i , hash[256];
10. memset(hash , 0 , sizeof(hash));
11.
12. for(i = 0 ; i < len ; ++i)
13. {
14. if(0 == hash[str[i]])
15. hash[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. while(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
请编写程序,统计满足输入整数的所有整数个数。
输入: 正整数,等式右边的数字
输出: 使该等式成立的个数
样例输入:5
样例输出:21
[cpp] view plaincopy
1. 转载请标明出处,原文地址:
2. #include<iostream>
3. #include<cstdio>
4. using namespace std;
5.
6. int ops[21];
7. const char sym[3] = {'+' , '-' , ' '};
8. int result , num;
9.
10. void dfs(int layer, 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. {
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. 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(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);
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?
分隔符为:?
指定的段为:2
字符串分割为:AAA BBB CCC共三段,第2段字符串为:BBB
输入输出格式要求
输入分隔字符串长度小于128个字符,指定的段是一个正整数。
样例
输入:AAA?BBB?CCC??2
输出:BBB
[cpp] view plaincopy
1. #include <iostream>
2. #include <Windows.h>
3. using namespace std;
4.
5. void spliteStr()
6. {
7. char str[100];
8. cin>>str;
9. 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--;
18. }
19. cout<<endl;
20. }
21.
22. int main()
23. {
24. spliteStr();
25. system("pause");
26. return 0;
27. }
题目二:输入若干整数,输出其中能被这些整数中其他元素整除的那些元素
描述
输入一组大于0小于1000的整数,且均不相同,逗号隔开,输出其中能被这些整数中其他元素整除的那些元素。
输入输出格式要求
输入要求同上述描述,输出要求整数顺序按照输入时的顺序输出。
样例
输入:2,4,6,8,10,12,3,9
输出:4,6,8,10,12,9
[cpp] view plaincopy
1. #include <iostream>
2. using namespace std;
3.
4. int main()
5. {
6. int a[100],b[100],tempIn,i,k;
7. char c = '0';
8. i = 0;
9. while(c != '\n'){
10. scanf("%d",&tempIn);
11. 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. break;
23. }
24. }
25. i--;
26. }
27. for(int j = k-1; j >= 0; j--){
28. cout<<b[j];
29. if(j != 0)
30. cout<<",";
31. }
32. cout<<endl;
33. system("pause");
34. return 0;
35. }
题
展开阅读全文