2016/09/22 一大波华为机考题目来袭

今天华为在哈尔滨地区的校园招聘的简历提交截止,并且立即开展了一拨又一拨的上机笔试。我们在外面也见证了一批又一批的题目,我就在这里记录一下。
最新鲜的是晚上的这波的第三题,是一个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] = 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打怪的问题,都是往年的题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值