收藏 分销(赏)

华为机试题汇总作者.doc

上传人:pc****0 文档编号:7272044 上传时间:2024-12-28 格式:DOC 页数:21 大小:360.75KB 下载积分:10 金币
下载 相关 举报
华为机试题汇总作者.doc_第1页
第1页 / 共21页
华为机试题汇总作者.doc_第2页
第2页 / 共21页


点击查看更多>>
资源描述
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. }   题
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服