2016/09/22 一大波华为机考题目来袭
2016-09-22 22:00
253 查看
今天华为在哈尔滨地区的校园招聘的简历提交截止,并且立即开展了一拨又一拨的上机笔试。我们在外面也见证了一批又一批的题目,我就在这里记录一下。
最新鲜的是晚上的这波的第三题,是一个CD-Key生成的问题。
某软件简单实现建议的CD-Key算法。输入3个正整数,以空格形式隔开,根据这三个正整数生成CD-Key序列。输出的格式为:XXXX-XXXX-XXXX-XXYY。最后两位是前面14位的自校验,确保本身合法。CD-Key使用的字符表为:23456789ABCDEFGHJKLMNPQRSTUVWXYZ。其原理大致如下
1、输入3个32bit的正整数,按照顺序取每个正整数的低16bit,假设3个低16bit为a、b、c,将abc串联组成一个48bit的环形。然后从低位到高位,每次取出5个bit,其数值作为下表,去字符表中查表出对应的字符,如此循环输出14个字符(注意:第一个输出的字符应该是c的低5bit对应数字的输出字符);2、上面输出的14个字符的ASCII码求和,取低10bit,从低到高,每5个bit为下标,查表生成两个字符,即为校验位。
代码如下(欠优化):
其实晚上的题目,相对于下午的要简单一些。下面是晚上的第二道题目:
一个英文句子仅仅有单词、逗号、句号、空格组成。要求过滤掉句子中的重复单词(保留重复单词中的第一个,按照句子顺序输出不重复的单词,不包括标点符号)。单词区分大小写,Where和where是不同的。
例如:where there is a will, there is a way的输出则是where there is a will way
晚上这波第一道题目是一道鸡兔同笼并且要验证输入的问题:
输入鸡和兔子的头数h和脚数f,输出这样的组合是否存在(0表示不存在,1表述存在),以及鸡的数目c,兔子的数目r(当m=0时,c=0,r=0)。
下午有一道题目是这样的:
小华截获了一段敌军密电,密电内容是n个数字,从这n个数字中可以解密出下一次敌军在战斗中投入的人数。解密规则是这样的:第一次从n个数据中取出两个数据相加,然后从余下的数据中取一个,与上次的和相加,如此循环知道n个数据取完。再将每次的和相加,就是下次投入战斗的敌人数目。请计算出下一次敌军投入战斗的最大数目。
下午还有一道题目是这样的:
简化版本的消消乐(一维的),即在给定的一位数组中(15个数据,用例有且仅有15个数据)。如果连续三个或者连续三个以上的数据相同,则将这些数据删除。同样,因为删除而结合在一起的数据如果重复次数超过三次,也要将该数据删除。最终输出不能够在消去的数组。如果数据全部被删除的话则输出none。
再往前推就是上午的上机试题了。有个读博的同学去了,据说是tom礼物的问题,是往年的考题。还有同学做到的冒险王子从山洞逃跑的问题,游戏中与大boss打怪的问题,都是往年的题目。
最新鲜的是晚上的这波的第三题,是一个CD-Key生成的问题。
某软件简单实现建议的CD-Key算法。输入3个正整数,以空格形式隔开,根据这三个正整数生成CD-Key序列。输出的格式为:XXXX-XXXX-XXXX-XXYY。最后两位是前面14位的自校验,确保本身合法。CD-Key使用的字符表为:23456789ABCDEFGHJKLMNPQRSTUVWXYZ。其原理大致如下
1、输入3个32bit的正整数,按照顺序取每个正整数的低16bit,假设3个低16bit为a、b、c,将abc串联组成一个48bit的环形。然后从低位到高位,每次取出5个bit,其数值作为下表,去字符表中查表出对应的字符,如此循环输出14个字符(注意:第一个输出的字符应该是c的低5bit对应数字的输出字符);2、上面输出的14个字符的ASCII码求和,取低10bit,从低到高,每5个bit为下标,查表生成两个字符,即为校验位。
代码如下(欠优化):
#include<iostream> using namespace std; void main(void) { char table[33] = {'2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'}; unsigned int a,b,c; int i,j; cin>>a; cin>>b; cin>>c; unsigned int tmp1,tmp2; tmp1 = (a & 0x0000ffff)<<16; tmp1 = (b & 0x0000ffff) | tmp1; tmp2 = (c & 0x0000ffff)<<16; char tmp = 0x00; unsigned int t = 0x00; char res[17]={0}; char fina[17] = {0}; bool d[97] = {0}; for(i = 0;i<32;i++) { d[i] = ((tmp1 & 0x80000000) == 0x80000000); tmp1 = tmp1<<1; } for(i=32;i<48;i++) { d[i] = ((tmp2 & 0x80000000) == 0x80000000); tmp2 = tmp2<<1; } for(i=48;i<97;i++) { d[i] = 4000 d[i-48]; } for(i=0;i<14;i++) { for(j = 0;j<5;j++) { if(d[95-i*5-j]) { tmp = tmp | 0x20; } else { tmp = tmp & 0xdf; } tmp = tmp>>1; } res[i] = tmp; tmp = 0x00; } for(i=0;i<14;i++) { fina[i] = table[res[i]]; if(res[i]<8) { t = t + table[res[i]]; } else { t = t + table[res[i]]; } } tmp = (char)(t & 0x0000001f); fina[14] = table[tmp]; tmp = (char)((t & 0x000003e0)>>5); fina[15] = table[tmp]; for(i=0;i<16;i++) { cout<<fina[i]; if((i!=15)&&(i%4 == 3)) { cout<<"-"; } } cout<<endl; system("pause"); }
其实晚上的题目,相对于下午的要简单一些。下面是晚上的第二道题目:
一个英文句子仅仅有单词、逗号、句号、空格组成。要求过滤掉句子中的重复单词(保留重复单词中的第一个,按照句子顺序输出不重复的单词,不包括标点符号)。单词区分大小写,Where和where是不同的。
例如:where there is a will, there is a way的输出则是where there is a will way
晚上这波第一道题目是一道鸡兔同笼并且要验证输入的问题:
输入鸡和兔子的头数h和脚数f,输出这样的组合是否存在(0表示不存在,1表述存在),以及鸡的数目c,兔子的数目r(当m=0时,c=0,r=0)。
下午有一道题目是这样的:
小华截获了一段敌军密电,密电内容是n个数字,从这n个数字中可以解密出下一次敌军在战斗中投入的人数。解密规则是这样的:第一次从n个数据中取出两个数据相加,然后从余下的数据中取一个,与上次的和相加,如此循环知道n个数据取完。再将每次的和相加,就是下次投入战斗的敌人数目。请计算出下一次敌军投入战斗的最大数目。
下午还有一道题目是这样的:
简化版本的消消乐(一维的),即在给定的一位数组中(15个数据,用例有且仅有15个数据)。如果连续三个或者连续三个以上的数据相同,则将这些数据删除。同样,因为删除而结合在一起的数据如果重复次数超过三次,也要将该数据删除。最终输出不能够在消去的数组。如果数据全部被删除的话则输出none。
再往前推就是上午的上机试题了。有个读博的同学去了,据说是tom礼物的问题,是往年的考题。还有同学做到的冒险王子从山洞逃跑的问题,游戏中与大boss打怪的问题,都是往年的题目。
相关文章推荐
- 华为2014机考题目_判断if括号匹配是否合法_堆栈_简单的方法- -
- 华为校园招聘笔试题(机考题目)
- 华为某次机考题目n个人n盏灯
- 华为2016年上机机考题目
- 华为笔试题目做题-2
- 2012 届华为校园招聘上机考试题目(9 月 6 日下午 1 点场)
- 华为--C++ 笔试面试题目
- 华为OJ题目(六):名字的漂亮度
- 华为OJ题目(十一):合唱队
- 华为机试题目
- 华为oj题目(java版)
- 华为上机题目
- 武汉新gre机考作文的题目
- 插一道华为的题目,华为就爱这种题
- 华为机试题目---字符串替换
- 2012届华为校园招聘上机考试题目(9月6日下午1点场)
- 009语音识别-华为机试题目
- 华为 2016实习生 上机考试 题目
- 华为上机题目之数组比较