zoukankan      html  css  js  c++  java
  • 华为机试题

    [编程题]删数
    有一个数组a[N]顺序存放0-N,要求没隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为 例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删 除)->6->7->0(删除),如此循环直到最后一个数被删除。

    输入描述:
    每组数据为一行一个整数n(小于等于1000),为数组成员数,如100,则对a[999]进行计算。


    输出描述:
    一行输出最后一个被删掉的数的原始下标位置。

    输入例子:
    8

    输出例子:
    6
    #include<iostream>
    #include<list>
    using namespace std;
    int main()
    {
        int M=2;
        int N;
        while(cin>>N)
        {
            list<int> lst;
            for(int i=0;i<N;i++)
            {
                lst.push_back(i);
            }
            list<int>::iterator iter=lst.begin();
            while(lst.size()>1)
            {
                if(iter==lst.end())
                    iter=lst.begin();
                for(int i=0;i<M;i++)
                {
                    iter++;
                    if(iter==lst.end())
                        iter=lst.begin();
                    
                }
               /* list<int>::iterator next=iter++;
                if(next==lst.end())
                    next=lst.begin();
                iter--;*/
                iter=lst.erase(iter);
               
     
            }
            cout<<lst.front()<<endl;
        }
        return 0;
    }
    [编程题]扑克牌大小
    扑克牌游戏大家应该都比较熟悉了,一副牌由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)输入的顺子已经经过从小到大排序,因此不用再排序了.

    输入描述:
    输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。


    输出描述:
    输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。

    输入例子:
    4 4 4 4-joker JOKER
    

    输出例子:
    joker JOKER
    
    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
    #define PrintS1 {cout << s1 << endl;return 0;}
    #define PrintS2 {cout << s2 << endl;return 0;}
    int count(string & str){
        int n = 0;
        string::size_type  i = 0 , k=0;
        while ((k=str.find(' ',i)) != string::npos){
            n++;i = k + 1;
        }
        return n;
    }
    int main(){
        string input;
        getline(cin, input);
        string s1, s2;
        int t = input.find('-');
        s1 = input.substr(0, t);
        s2 = input.substr(t + 1);
        int n1 = count(s1);
        int n2 = count(s2);
        string POKER = "345678910JQKA2jokerJOKER";
        vector<string> MAX = { "joker JOKER", "JOKER joker" };
        if (s1 == MAX[0] || s1 == MAX[1]) PrintS1
        if (s2 == MAX[0] || s2 == MAX[1]) PrintS2
        if (n1==n2){
            string f1, f2;
            string::size_type k = s1.find(' ');
            f1 = s1.substr(0, k);
            k = s2.find(' ');
            f2 = s2.substr(0, k);
            if (POKER.find(f1) > POKER.find(f2))PrintS1
            PrintS2
        }
        if (n1 == 3 && n2 != 3) PrintS1
        if (n2 == 3 && n1 != 3) PrintS2
        cout << "ERROR" << endl;
    }

    以上解法来自牛客网。

    之后我自己的解法如下:注意getline 的使用

    #include<iostream>
    #include<vector>
    using namespace std;
    int getLen(string str);
    int main()
    {
        string str;
        while(getline(cin, str))
        {
            string str1,str2;
            int flag=str.find('-');
            str1=str.substr(0,flag);
            str2=str.substr(flag+1);
            if(str1=="joker JOKER"||str1=="JOKER joker")
            {
                cout<<str1<<endl;
                continue;
            }
            if(str2=="joker JOKER"||str2=="JOKER joker")
            {
                cout<<str2<<endl;
                continue;
            }
            string POKE="3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER";
            int len1=getLen(str1);
            int len2=getLen(str2);
            if(len1==4&&len2!=4)
            {
                cout<<str1<<endl;
                continue;
            } 
            else if(len2==4&&len1!=4)
            {
                cout<<str2<<endl;
                continue;
            }
            else if(len1==len2)
            {
                int flag1=str1.find(' ');
                string s1=str1.substr(0,flag1);
                int flag2=str2.find(' ');
                string s2=str2.substr(0,flag2);
                flag1=POKE.find(s1);
                flag2=POKE.find(s2);
                if(flag1>flag2)
                    cout<<str1<<endl;
                if(flag1<flag2)
                    cout<<str2<<endl;
                continue;
                    
            }
            cout<<"ERROR"<<endl;
     
        }
        return 0;
    }
    int getLen(string str)
    {
        int res=0;
         for(int i=0;i<str.size();i++)
            if(str[i]==' ')
                res++;
        return res+1;
    }
    [编程题]简单错误记录

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

    输入描述:
    一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
    文件路径为windows格式
    如:E:V1R2productfpgadrive.c 1325


    输出描述:
    将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 
    结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
    如果超过8条记录,则只输出前8条记录.
    如果文件名的长度超过16个字符,则只输出后16个字符
    输入例子:
    E:V1R2productfpgadrive.c 1325
    
    输出例子:
    fpgadrive.c 1325 
    #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(void){
        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++;
        }
    }

    以上解法来自牛客网。

    [编程题]质数因子

    功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )

    最后一个数后面也要有空格
    输入描述:

    输入一个long型整数



    输出描述:

    按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。


    输入例子:
    180
    

    输出例子:
    2 2 3 3 5
    
  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/5746497.html
Copyright © 2011-2022 走看看