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函数返回:02) 输入: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”函数返回:192) 输入: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,A6:什么都不是7:只有一对 第十题:号码合法性判断(20分)问题描述:我国大陆运营商的号码标准格式为:国家码+号码,例如:8613912345678。
特点如下: 1、 长度13位;2、 以86的国家码打头;3、 号码的每一位都是数字 请实现号码合法性判断的函数要求:1) 如果号码合法,返回0;2) 如果号码长度不合法,返回13) 如果号码中包含非数字的字符,返回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,U2、 筛选出来的元音字母,不需要剔重; 最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序 要求实现函数: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位可以是数字或者小写英文字母x4、 身份证号码的第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即可,不需要再做其他合法性判断要求实现函数。