2019年網易遊戲暑期實習生招聘筆試題(2018年4月27日)第一題解答
阿新 • • 發佈:2018-12-23
題目描述:足球比賽的積分排名,一共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; }