您的位置:首页 > 其它

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为下标,查表生成两个字符,即为校验位。

代码如下(欠优化):

#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打怪的问题,都是往年的题目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 校园招聘 算法