• 华为机试题


    [编程题]删数
    有一个数组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
    
  • 相关阅读:
    由typedef和函数指针引起的危机
    从JVM角度看Java多态
    C语言中判断字符串str1是否以str2开始或结束
    Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组
    C语言中的条件编译
    学会 Python 到底能干嘛?我们整理出了 7 大工作方向……
    新手指南:我应该学哪种编程语言?
    盘点:2019年最赚钱的10种编程语言
    11个提升编程能力的小方法
    收好这份 Vue 升级图,假期偷偷上个钻
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/5746497.html
Copyright © 2020-2023  润新知