1. 程式人生 > >2019年網易遊戲暑期實習生招聘筆試題(2018年4月27日)第一題解答

2019年網易遊戲暑期實習生招聘筆試題(2018年4月27日)第一題解答

題目描述:足球比賽的積分排名,一共16支球隊,分為4組,每組4支球隊,小組賽實行單迴圈制,每組一共進行6場比賽,勝者積3分,負者0分,打成平局各得一分,積分相同看淨勝球數,淨勝球多的排名靠前,淨勝球數相同看總進球數,總進球數多的排名靠前,總進球數也相同的球隊,名稱的字母序小的排在前面。

輸入描述:每個資料依次給出A,B,C,D四個小組的比賽資訊。每6行表示一個小組的比賽資訊,最開始的6行表示A組的6場比賽結果,然後依次是B組,C組,D組的比賽結果,每組比賽資訊之間有一個空行。比賽資訊的格式是“teamA numA:numB teamB”表示teamA和teamB進行比賽,比賽結果是numA:numB, numA和numB的範圍是【0,9】,teamA和teamB均是三個大寫字母表示,保證所有資料是合法的。

輸出描述:依次輸入A,B,C,D四個小組的最終排名情況。每個小組輸出一行,包含4個隊伍的名稱,表示該小組的最終排名。隊伍名稱之間有一個空格,行末無空格。

題目分析:此題是考察候選者語言和語法的綜合程式設計能力,涉及到的演算法很簡單,難點在於輸入格式和輸出格式必須符合題目要求,對於資料結構的使用必須合理得當,是一道考察考生基本程式設計功底的好題目,有區分度。

以下是本人用C++寫的題目答案,僅供參考。在VS2013下除錯執行成功,測試用例都有完全符合。

#include<iostream>

#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
//球隊結構體
struct team
{
    string name;  //球隊名稱
    int goalCount = 0;    //球隊總進球數
    int goalDiff = 0;    //球隊淨勝球數
    int grade = 0;    //球隊總積分
    int goalMiss = 0;    //球隊總失球數
};
//排序邏輯函式
bool compare(team &t1, team &t2)
{
    if (t1.grade > t2.grade) return true;
    else if (t1.grade == t2.grade)
    {
        if (t1.goalDiff > t2.goalDiff)
            return true;
        else if (t1.goalDiff == t2.goalDiff)
        {
            if (t1.goalCount > t2.goalCount)
                return true;
            else if (t1.goalCount == t2.goalCount)
            {
                if (t1.name<t2.name)
                    return true;
                else return false;
            }
            else return false;
        }
        else return false;
    }
    else return false;
}
//以小組為單位輸入,計算同一小組各支球隊的積分,進球數,失球數和淨勝球數
void mySort(vector<team> &A)
{
    map<string, team> mp;
    for (int i = 0; i < 6; i++)
    {
        char m[12];
        cin.getline(m, 12);        
        string str1, str2, str11, str22;
        string str(m);
        str1 = str.substr(0, 3);
        str2 = str.substr(8, 3);
        str11 = str.substr(4, 1);
        str22 = str.substr(6, 1);
        if (atoi(str11.c_str())>atoi(str22.c_str()))
            mp[str1].grade += 3;
        else if (atoi(str11.c_str()) < atoi(str22.c_str()))
            mp[str2].grade += 3;
        else
        {
            mp[str1].grade += 1;
            mp[str2].grade += 1;
        }
        mp[str1].goalCount += atoi(str11.c_str());
        mp[str2].goalCount += atoi(str22.c_str());
        mp[str1].goalMiss += atoi(str22.c_str());
        mp[str2].goalMiss += atoi(str11.c_str());
        mp[str1].name = str1;
        mp[str2].name = str2;
     }

    for (auto it = mp.begin(); it != mp.end();)
    {
        A.push_back(it->second);
        it++;
    }
    for (int i = 0; i < A.size(); i++)
    {
        A[i].goalDiff = A[i].goalCount - A[i].goalMiss;
    }
    sort(A.begin(), A.end(), compare);  //排序
    cout << endl;
}
int main()
{
    vector<vector<team>> t(4);
    for (int i = 0; i < 4; i++)
    {
        mySort(t[i]);
    }
    for (size_t i = 0; i < t.size(); i++)
    {
        for (size_t j = 0; j < t[0].size(); j++)
        {
            cout << t[i][j].name << ' ';
        }
        cout << endl;
    }
    system("pause");
    cout << endl;
}