- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
输出:
1 0
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
python解法
第一个输入是员工的总人数 n。
第二个输入是员工的出勤情况,每个员工有一个唯一的 ID。
接下来,输入 30 天的员工登录数据,每一天登录的员工 ID 被记录在一个列表中。
统计每个员工的出勤天数:
对于每一天的登录记录,遍历每个登录的员工 ID,统计他们的出勤天数。如果员工 ID 是第一次出现,则记录下这个员工的出勤天数为 1,同时记录下第一次出勤的天数。
排序:
根据出勤天数排序,首先按照出勤天数(从多到少)排序,若出勤天数相同,则按照第一次出勤的天数排序(从早到晚),如果还相同,则按照员工 ID 排序(从小到大)。
输出前 5 名员工的 ID:
最后,返回排名前 5 的员工 ID,按要求输出。
n = int(input())
attendance = list(map(int, input().split()))
logins = []
for _ in range(30):
logins.append(list(map(int, input().split())))
def find_top(logins):
workers_data = {}
for day_idx in range(len(logins)):
daily_ids = logins[day_idx]
for emp_id in daily_ids:
if emp_id in workers_data:
workers_data[emp_id]["attended_days"] += 1
else:
workers_data[emp_id] = {
'attended_days': 1,
'first_day': day_idx
}
rankings = []
for emp_id, data in workers_data.items():
rankings.append((emp_id, data["attended_days"], data["first_day"]))
rankings.sort(key=lambda x: (-x[1], x[2], x[0]))
return " ".join([str(x[0]) for x in rankings[:5]])
print(find_top(logins))
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
java解法
第一个输入是员工的总人数 n(虽然在代码中没有直接用到)。
第二个输入是一个包含 30 天数据的数组,表示每一天登录的员工人数。
接下来,输入每天的员工 ID,用来记录当天哪些员工登录了。
数据结构:
使用一个 TreeMap 来存储每个员工的登录数据:
Integer 为员工的 ID。
Integer[] 数组包含两个元素:[0] 表示员工的出勤天数,[1] 表示员工第一次出勤的天数(即对应的天数索引)。
数据处理:
对于每一天的登录记录,遍历员工 ID,更新该员工的出勤天数。如果是第一次登录,记录第一次出勤的天数。
排序:
根据出勤天数(降序)进行排序;若出勤天数相同,则按照第一次出勤天数(升序)排序;若两者还相同,则按照员工 ID(升序)排序。
输出前 5 名:
排序完成后,返回排名前 5 的员工 ID,输出结果
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] days = new int[30];
for (int i = 0; i < 30; i++) {
days[i] = sc.nextInt();
}
Map<Integer, Integer[]> records = new TreeMap<>();
for (int i = 0; i < 30; i++) {
for (int j = 0; j < days[i]; j++) {
int id = sc.nextInt();
if (!records.containsKey(id)) {
records.put(id, new Integer[] {0, i});
}
records.get(id)[0]++;
}
}
List<Integer> top5 = getTop5(records);
for (int i = 0; i < top5.size(); i++) {
if (i > 0) System.out.print(" ");
System.out.print(top5.get(i));
}
}
public static List<Integer> getTop5(Map<Integer, Integer[]> records) {
List<Map.Entry<Integer, Integer[]>> list = new ArrayList<>(records.entrySet());
list.sort((a, b) -> {
if (b.getValue()[0].equals(a.getValue()[0])) {
return a.getValue()[1].equals(b.getValue()[1]) ? a.getKey() - b.getKey() : a.getValue()[1] - b.getValue()[1];
}
return b.getValue()[0] - a.getValue()[0];
});
List<Integer> result = new ArrayList<>();
for (int i = 0; i < Math.min(5, list.size()); i++) {
result.add(list.get(i).getKey());
}
return result;
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
C++解法
第一个输入是员工总数 n(但在此题中并未直接使用)。
第二个输入是一个包含 30 天数据的数组 dailyCounts,表示每天登录的员工人数。
接下来是 30 天的具体员工登录记录,每天的登录员工 ID 存储在二维数组 dailyIds 中。
记录员工出勤情况:
使用 unordered_map> recordMap 来存储每个员工的出勤信息。
int 是员工的 ID。
pair 中,first 是该员工的出勤天数,second 是员工第一次出勤的天数(索引)。
更新出勤记录:
遍历每一天的登录记录,更新每个员工的出勤天数。如果是该员工第一次出勤,则记录其第一次出勤的天数。
排序:
将员工的出勤数据从 unordered_map 转换为 vector>,每个元素是一个包含员工 ID、出勤天数和第一次出勤天数的元组。
按照以下优先顺序排序:
出勤天数(降序)。
如果出勤天数相同,则按照第一次出勤天数(升序)。
如果两者都相同,则按照员工 ID(升序)。
输出前 5 名:
排序后,输出排名前 5 的员工 ID,按要求输出。
#include
#include
#include
#include
#include
using namespace std;
string calculateTop5(const vector<vector<int>>& dailyIds) {
unordered_map<int, pair<int, int>> recordMap;
for (int i = 0; i < dailyIds.size(); i++) {
for (int id : dailyIds[i]) {
if (recordMap.find(id) == recordMap.end()) {
recordMap[id] = { 1, i };
}
else {
recordMap[id].first++;
}
}
}
vector<tuple<int, int, int>> resultList;
for (const auto& entry : recordMap) {
int id = entry.first;
int count = entry.second.first;
int day = entry.second.second;
resultList.push_back(make_tuple(id, count, day));
}
sort(resultList.begin(), resultList.end(), [](const tuple<int, int, int>& a, const tuple<int, int, int>& b) {
if (get<1>(a) != get<1>(b)) {
return get<1>(a) > get<1>(b);
}
else if (get<2>(a) != get<2>(b)) {
return get<2>(a) < get<2>(b);
}
else {
return get<0>(a) < get<0>(b);
}
});
string result;
for (int i = 0; i < min(5, (int)resultList.size()); i++) {
result += to_string(get<0>(resultList[i])) + " ";
}
if (!result.empty() && result.back() == ' ') {
result.pop_back();
}
return result;
}
int main() {
int n;
cin >> n;
vector<int> dailyCounts(30);
for (int i = 0; i < 30; i++) {
cin >> dailyCounts[i];
}
vector<vector<int>> dailyIds(30);
for (int i = 0; i < 30; i++) {
dailyIds[i].resize(dailyCounts[i]);
for (int j = 0; j < dailyCounts[i]; j++) {
cin >> dailyIds[i][j];
}
}
cout << calculateTop5(dailyIds) << endl;
return 0;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: