zoukankan      html  css  js  c++  java
  • 华为2016校园招聘上机笔试题

    题目链接

    这次的题写了很久,第一题是以前做过的线段树:传送门。第二题是一个文件模拟,还不算太麻烦吧。第三题是模拟打扑克,让我想起了大一打省赛那道题,当时太弱了和室友讨论了很久感觉写的都对还是没做出来,这次虽然也写了很久,写得特别麻烦,还是满分A了。后面会附上简洁版的代码。

    一、见上传送门。

    二、开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 

    处理:
    1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
    2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
    3.输入的文件可能带路径,记录文件名称不能带路径

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct sa
    {
        char c[1005];
        int pos,num,fr;
    }data[15];
    bool cmp(sa x,sa y)
    {
        if(x.num==y.num) return x.fr<y.fr;
        return x.num>y.num;
    }
    int main()
    {
        char s[1005],s2[1005];
        memset(data,0,sizeof(data));
        int cnt=0;
        int x;
        int t=0;
        while(scanf("%s%d",s,&x)!=EOF)
        {
            t++;
            int len=strlen(s),k=-1;
            for(int i=0;i<len;i++)
            if(s[i]=='\') k=i;
            int l=0;
            memset(s2,0,sizeof(s2));
            for(int i=k+1;i<len;i++)
            s2[l++]=s[i];
            if(cnt==0)
            {
                for(int i=0;i<l;i++)
                data[cnt].c[i]=s2[i];
                data[cnt].pos=x;
                data[cnt].num++;
                data[cnt].fr=t;
                cnt++;
            }
            else
            {
                int ans=-1;
                for(int i=0;i<cnt;i++)
                if((strcmp(data[i].c,s2)==0)&&(data[i].pos==x))
                {
                    ans=i;
                    break;
                }
                if(ans==-1)
                {
                    for(int i=0;i<l;i++)
                    data[cnt].c[i]=s2[i];
                    data[cnt].pos=x;
                    data[cnt].num++;
                    data[cnt].fr=t;
                    cnt++;
                }
                else
                {
                    data[ans].num++;
                }
            }
        }
        //printf("%d
    ",cnt);
        //return 0;
        sort(data,data+cnt,cmp);
        for(int i=0;i<min(cnt,8);i++)
        {
            int len=strlen(data[i].c);
            if(len<=16)
            printf("%s",data[i].c);
            else
            for(int j=len-16;j<len;j++)
            printf("%c",data[i].c[j]);
            printf(" %d %d
    ",data[i].pos,data[i].num);
        }
        return 0;
    }
    /*
    e:1aaaaaaaaaaaa2.txt 2
    e:1aaaaaaaaaaaa3.txt 3
    e:1aaaaaaaaaaaa3.txt 2
    e:1aaaaaaaaaaaa2.txt 3
    e:1aaaaaaaaaaaa2.txt 2
    e:3aaaaaaaaaaaa1.txt 3
    e:1aaaaaaaaaaaa3.txt 1
    e:1aaaaaaaaaaaa3.txt 2
    e:3aaaaaaaaaaaa1.txt 1
    e:2aaaaaaaaaaaa2.txt 1
    e:1aaaaaaaaaaaa1.txt 2
    */


    三、扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 

    3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 
    输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
    请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR

    基本规则:
    (1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
    (2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
    (3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
    (4)输入的两手牌不会出现相等的情况。

    答案提示:
    (1)除了炸弹和对王之外,其他必须同类型比较。
    (2)输入已经保证合法性,不用检查输入是否是合法的牌。
    (3)输入的顺子已经经过从小到大排序,因此不用再排序了.

    #include <cstdio>
    #include <cstring>
    using namespace std;
    int change(char c)
    {
        if(c=='1') return 10;
        if(c>='3'&&c<='9') return (c-'0');
        if(c=='J') return 11;
        if(c=='Q') return 12;
        if(c=='K') return 13;
        if(c=='A') return 14;
        if(c=='2') return 15;
        return 0;
    }
    int f[5];
    int val[5];
    //1单 2对 3三 4顺子 5炸 6双王
    char c[1005];
    char data1[50][50],data2[50][50];
    int num1[50],num2[50];
    int cnt[5],i;
    void debug()
    {
        printf("%d %d**
    ",cnt[1],cnt[2]);
        for(int i=0; i<cnt[1]; i++)
        {
            for(int j=0; j<num1[i]; j++)
                printf("%c",data1[i][j]);
            puts("");
        }
        for(int i=0; i<cnt[2]; i++)
        {
            for(int j=0; j<num2[i]; j++)
                printf("%c",data2[i][j]);
            puts("");
        }
    }
    int main()
    {
        while(gets(c))
        {
            memset(num1,0,sizeof(num1));
            memset(num2,0,sizeof(num2));
            int len=strlen(c);
            i=0;
            memset(cnt,0,sizeof(cnt));
            memset(f,0,sizeof(f));
            memset(val,0,sizeof(val));
            for(; i<len; i++)
            {
                if(c[i]=='-')
                {
                    i++;
                    break;
                }
                if(c[i]!=' ')
                    data1[cnt[1]][num1[cnt[1]]++]=c[i];
                else
                    cnt[1]++;
            }
            for(; i<len; i++)
            {
                if(c[i]!=' ')
                    data2[cnt[2]][num2[cnt[2]]++]=c[i];
                else
                    cnt[2]++;
            }
            cnt[1]++;
            cnt[2]++;
            //debug();
            //return 0;
            for(int z=1; z<=2; z++)
            {
                if(cnt[z]==1) // dan
                {
                    f[z]=1;
                    if(z==1)
                    {
                        if(num1[0]==5)
                        {
                            if(data1[0][0]>='a'&&data1[0][0]<='z')
                                val[z]=20;// xiao wang
                            else
                                val[z]=30;
                        }
                        else
                            val[z]=change(data1[0][0]);
                    }
                    else
                    {
                        if(num2[0]==5)
                        {
                            if(data2[0][0]>='a'&&data2[0][0]<='z')
                                val[z]=20;// xiao wang
                            else
                                val[z]=30;
                        }
                        else
                            val[z]=change(data2[0][0]);
                    }
                }
                else if(cnt[z]==2) // dui zi 指的是两个分开带数 不是说10 这种
                {
                    f[z]=2;
                    if(z==1)
                    {
                        if(num1[0]==5)
                        {
                            if(data1[0][0]>='a'&&data1[0][0]<='z')
                                val[z]=10086; // daxiao wang
                            f[z]=6;
                        }
                        else
                            val[z]=change(data1[0][0]);
                    }
                    else
                    {
                        if(num2[0]==5)
                        {
                            if(data2[0][0]>='a'&&data2[0][0]<='z')
                                val[z]=10086; // daxiao wang
                            f[z]=6;
                        }
                        else
                            val[z]=change(data2[0][0]);
                    }
                }
                else if (cnt[z]==3)
                {
                    f[z]=3;
                    if(z==1) val[z]=change(data1[0][0]);
                    else val[z]=change(data2[0][0]);
                }
                else if(cnt[z]==4)
                {
                    f[z]=5;
                    if(z==1) val[z]=change(data1[0][0]);
                    else val[z]=change(data2[0][0]);
                }
                else if(cnt[z]==5)
                {
                    f[z]=4;
                    if(z==1) val[z]=change(data1[0][0]);
                    else val[z]=change(data2[0][0]);
                }
            }
            //printf("%d %d %d
    %d %d %d
    ",cnt[1],f[1],val[1],cnt[2],f[2],val[2]);
            if(f[1]==f[2])//tong lei
            {
                if(val[1]>val[2])
                {
                    for(int i=0; i<cnt[1]; i++)
                    {
                        for(int j=0; j<num1[i]; j++)
                            printf("%c",data1[i][j]);
                            if(i!=cnt[1]-1)
                        printf(" ");
                    }
                }
                else
                {
                    for(int i=0; i<cnt[2]; i++)
                    {
                        for(int j=0; j<num2[i]; j++)
                            printf("%c",data2[i][j]);
                            if(i!=cnt[2]-1)
                        printf(" ");
                    }
                }
            }
            else if(f[1]>=5&&f[2]<=4)
            {
                for(int i=0; i<cnt[1]; i++)
                {
                    for(int j=0; j<num1[i]; j++)
                        printf("%c",data1[i][j]);
                        if(i!=cnt[1]-1)
                    printf(" ");
                }
            }
            else if(f[2]>=5&&f[1]<=4)
            {
                for(int i=0; i<cnt[2]; i++)
                {
                    for(int j=0; j<num2[i]; j++)
                        printf("%c",data2[i][j]);
                        if(i!=cnt[2]-1)
                    printf(" ");
                }
            }
            else if(f[1]>=5&&f[2]>=5)
            {
                if(val[1]>val[2])
                {
                    for(int i=0; i<cnt[1]; i++)
                    {
                        for(int j=0; j<num1[i]; j++)
                            printf("%c",data1[i][j]);
                        if(i!=cnt[1]-1)
                        printf(" ");
                    }
                }
                else
                {
                    for(int i=0; i<cnt[2]; i++)
                    {
                        for(int j=0; j<num2[i]; j++)
                            printf("%c",data2[i][j]);
                            if(i!=cnt[2]-1)
                        printf(" ");
                    }
                }
            }
            else
                printf("ERROR");
            puts("");
        }
        return 0;
    }

    第二题:

    getline(cin, input)getline不是C库函数,而是C++库函数。它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。

    substrsubstr是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。

    stable_sort的用法与sort一致,区别是stable_sort函数遇到两个数相等时,不对其交换顺序;这个应用在数组里面不受影响,当函数参数传入的是结构体时,会发现两者之间的明显区别;

    这个代码写的特别妙

    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    bool compare(pair<string, int> a, pair<string, int> b){
        return a.second > b.second;
    }
    int main(){
        string input, file;
        vector<pair<string, int> > errors;
        while (getline(cin, input)){
            if (input.size() == 0)
                break;
            unsigned int f = input.rfind('\');
            file = input.substr(f + 1);
            errors.push_back(make_pair(file, 1));
            for (int i = 0; i<(errors.size() - 1); i++){
                if (errors[i].first == file){
                    errors[i].second++;
                    errors.pop_back(); break;
                }
            }
        }
        stable_sort(errors.begin(), errors.end(), compare);
        int idx = 0;
        while (idx<8 && idx<errors.size()){
            string check = errors[idx].first;
            int t = check.find(' ');
            if (t>16)
                errors[idx].first.erase(0, t - 16);
            cout << errors[idx].first << ' ' << errors[idx].second << endl;
            idx++;
        }
    }

    第三题:

    用C写的,代码写的好厉害。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int *infoCard(char *a)
    {
        int *info = (int*)calloc(2, sizeof(int));
        //在内存的动态存储区中分配n个长度为size的连续空间
        if(*a == 'j'){
            info[0] = 6;
            return info;
        }
        switch(*a){
            case '1': info[1] = 10; break;
            case 'A': info[1] = 14; break;
            case '2': info[1] = 15; break;
            case 'J': info[1] = 11; break;
            case 'Q': info[1] = 12; break;
            case 'K': info[1] = 13; break;
            default: info[1] = *a-'0';
        }
        while(*a)
            if(*(a++) == ' ')
                ++info[0];
    
        ++info[0];
        return info;
    }
    int main()
    {
        char a[64], b[64];
        scanf("%[^-]-%[^
    ]", a, b);//正则表达式 就是分割出两个字符串
        int *ai = infoCard(a), *bi = infoCard(b);
        if(ai[0] == 6)
            printf("%s
    ", a);
        else if(bi[0] == 6)
            printf("%s
    ", b);
        else if(ai[0] == bi[0])
            printf("%s
    ", ai[1] > bi[1] ? a : b);
        else if(ai[0] == 4)
                printf("%s
    ", a);
            else if(bi[0] == 4)
            printf("%s
    ", b);
            else
            printf("ERROR
    ");
    
        free(ai);
        free(bi);
        return 0;
    }
  • 相关阅读:
    聊天的时间显示
    Android下Affinities和Task
    android Notification 的使用
    Android Notification使用及取消
    类似微信发图片的样式
    Delphi---TServerSocket和TClientSocket发送和接收大数据包
    使用拷贝文件测试(BufferedInputStream,FileInputStream)
    android-getTextSize返回值是以像素(px)为单位的,setTextSize()以sp为单位
    怎样成为PHP 方向的一个合格的架构师
    mac 查看某个文件夹下所有隐藏文件(夹)的大小
  • 原文地址:https://www.cnblogs.com/Ritchie/p/6421972.html
Copyright © 2011-2022 走看看