机考E卷100分题 - 智能成绩表

题目描述

小明来到学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?

输入描述

第 1 行输入两个整数,学生人数 n 和科目数量 m。

  • 0 < n < 100
  • 0 < m < 10

第 2 行输入 m 个科目名称,彼此之间用空格隔开。

  • 科目名称只由英文字母构成,单个长度不超过10个字符。
  • 科目的出现顺序和后续输入的学生成绩一一对应。
  • 不会出现重复的科目名称。

第 3 行开始的 n 行,每行包含一个学生的姓名和该生 m 个科目的成绩(空格隔开)

  • 学生不会重名。
  • 学生姓名只由英文字母构成,长度不超过10个字符。
  • 成绩是0~100的整数,依次对应第2行种输入的科目。

第n+2行,输入用作排名的科目名称。若科目不存在,则按总分进行排序。

输出描述

输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。

示例1

输入

3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 98
minmin 100 82
shuxue
123456

输出

xiaohua fangfang minmin
1

说明

按照shuxue成绩排名依次是 xiaohua fangfang minmin

示例2

输入

3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen
123456

输出

fangfang minmin xiaohua
1

说明

排序科目不存在,按总分排序 , fangfang 和 minmin 总分相同,按姓名的字典序顺序, fangfang 排在前面

解题思路

Java

import java.util.*;

public class Main {
    // 定义学生类
    static class Student {
        String name; // 学生姓名
        int totalScore; // 学生总分
        Map<String, Integer> scores; // 存储学生各科成绩的映射

        // 构造函数,初始化学生姓名、成绩映射和总分
        Student(String name) {
            this.name = name;
            this.scores = new HashMap<>();
            this.totalScore = 0;
        }

        // 添加成绩的方法,同时累加到总分
        void addScore(String subject, int score) {
            scores.put(subject, score);
            totalScore += score;
        }

        // 获取指定科目的成绩,若没有则返回0
        int getScore(String subject) {
            return scores.getOrDefault(subject, 0);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取学生人数和科目数量
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        scanner.nextLine(); // 读取并忽略换行符

        // 读取科目名称
        String[] subjects = scanner.nextLine().split(" ");
        List<Student> students = new ArrayList<>();

        // 读取每个学生的姓名和成绩
        for (int i = 0; i < n; i++) {
            String[] tokens = scanner.nextLine().split(" ");
            Student student = new Student(tokens[0]);
            for (int j = 0; j < m; j++) {
                student.addScore(subjects[j], Integer.parseInt(tokens[j + 1]));
            }
            students.add(student);
        }

        // 读取用作排名的科目名称
        String rankSubject = scanner.nextLine();
        // 关闭扫描器
        scanner.close();

        // 对学生列表进行排序
        students.sort((s1, s2) -> {
            // 根据指定科目或总分进行比较
            int score1 = rankSubject.equals("") ? s1.totalScore : s1.getScore(rankSubject);
            int score2 = rankSubject.equals("") ? s2.totalScore : s2.getScore(rankSubject);
            if (score1 != score2) {
                return score2 - score1; // 降序排序
            } else {
                return s1.name.compareTo(s2.name); // 成绩相同则按姓名升序排序
            }
        });

        // 输出排序后的学生姓名
        students.forEach(student -> System.out.print(student.name + " "));
    }
}

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Python

# 导入必要的库
from collections import defaultdict

# 定义学生类
class Student:
    def __init__(self, name):
        self.name = name  # 学生姓名
        self.total_score = 0  # 学生总分
        self.scores = defaultdict(int)  # 存储学生各科成绩的字典,默认值为0

    # 添加成绩的方法,同时累加到总分
    def add_score(self, subject, score):
        self.scores[subject] = score
        self.total_score += score

    # 获取指定科目的成绩
    def get_score(self, subject):
        return self.scores[subject]

# 主函数
def main():
    # 读取学生人数和科目数量
    n, m = map(int, input().split())
    
    # 读取科目名称
    subjects = input().split()
    students = []

    # 读取每个学生的姓名和成绩
    for _ in range(n):
        tokens = input().split()
        student = Student(tokens[0])
        for j in range(m):
            student.add_score(subjects[j], int(tokens[j + 1]))
        students.append(student)

    # 读取用作排名的科目名称
    rank_subject = input()

    # 对学生列表进行排序
    students.sort(key=lambda s: (-s.get_score(rank_subject) if rank_subject else -s.total_score, s.name))

    # 输出排序后的学生姓名
    for student in students:
        print(student.name, end=' ')

# 调用主函数
if __name__ == "__main__":
    main()

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950

JavaScript

// 引入 readline 模块用于读取命令行输入
const readline = require('readline');

// 创建 readline 接口实例
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// 定义学生类
class Student {
  constructor(name) {
    this.name = name; // 学生姓名
    this.totalScore = 0; // 学生总分
    this.scores = {}; // 存储学生各科成绩的映射
  }

  // 添加成绩的方法,同时累加到总分
  addScore(subject, score) {
    this.scores[subject] = score;
    this.totalScore += score;
  }

  // 获取指定科目的成绩,若没有则返回0
  getScore(subject) {
    return this.scores[subject] || 0;
  }
}

// 创建一个异步处理函数
async function processInput() {
  // 通过 readline 逐行读取输入
  const lines = [];
  for await (const line of rl) {
    lines.push(line);
  }

  // 解析输入数据
  const [n, m] = lines[0].split(' ').map(Number);
  const subjects = lines[1].split(' ');
  const students = [];

  // 读取每个学生的姓名和成绩
  for (let i = 0; i < n; i++) {
    const tokens = lines[i + 2].split(' ');
    const student = new Student(tokens[0]);
    for (let j = 0; j < m; j++) {
      student.addScore(subjects[j], parseInt(tokens[j + 1], 10));
    }
    students.push(student);
  }

  // 读取用作排名的科目名称
  const rankSubject = lines[n + 2];

  // 对学生列表进行排序
  students.sort((s1, s2) => {
    const score1 = rankSubject === '' ? s1.totalScore : s1.getScore(rankSubject);
    const score2 = rankSubject === '' ? s2.totalScore : s2.getScore(rankSubject);
    if (score1 !== score2) {
      return score2 - score1; // 降序排序
    } else {
      return s1.name.localeCompare(s2.name); // 成绩相同则按姓名升序排序
    }
  });

  // 输出排序后的学生姓名
  students.forEach(student => process.stdout.write(`${student.name} `));
  process.stdout.write('\n');

  // 关闭 readline 接口
  rl.close();
}

// 调用异步处理函数
processInput();

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677

C++

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

// 定义学生类
class Student {
public:
    string name; // 学生姓名
    int totalScore; // 学生总分
    map<string, int> scores; // 存储学生各科成绩的映射

    // 构造函数,初始化学生姓名和总分
    Student(const string& name) : name(name), totalScore(0) {}

    // 添加成绩的方法,同时累加到总分
    void addScore(const string& subject, int score) {
        scores[subject] = score; // 设置指定科目的成绩
        totalScore += score; // 累加到总分
    }

    // 获取指定科目的成绩
    int getScore(const string& subject) const {
        auto it = scores.find(subject); // 查找科目对应的成绩
        return it != scores.end() ? it->second : 0; // 如果找到,则返回成绩,否则返回0
    }
};

int main() {
    int n, m; // n为学生数量,m为科目数量
    cin >> n >> m;
    vector<string> subjects(m); // 存储科目名称的向量
    for (int i = 0; i < m; ++i) {
        cin >> subjects[i]; // 输入科目名称
    }
    vector<Student> students; // 存储学生对象的向量

    for (int i = 0; i < n; ++i) {
        string name; // 学生姓名
        cin >> name; // 输入学生姓名
        Student student(name); // 创建学生对象
        for (int j = 0; j < m; ++j) {
            int score; // 成绩
            cin >> score; // 输入成绩
            student.addScore(subjects[j], score); // 添加成绩到学生对象
        }
        students.push_back(student); // 将学生对象添加到向量中
    }

    string rankSubject; // 用作排名的科目名称
    cin >> rankSubject; // 输入排名科目

    // 对学生进行排序
    sort(students.begin(), students.end(), [&](const Student& a, const Student& b) {
        int scoreA = rankSubject.empty() ? a.totalScore : a.getScore(rankSubject); // 获取a的排名科目成绩或总分
        int scoreB = rankSubject.empty() ? b.totalScore : b.getScore(rankSubject); // 获取b的排名科目成绩或总分
        if (scoreA != scoreB) {
            return scoreA > scoreB; // 成绩高的排前面
        }
        return a.name < b.name; // 成绩相同则按姓名字典序排列
    });

    // 输出排序后的学生姓名
    for (const auto& student : students) {
        cout << student.name << ' ';
    }
    cout << endl;

    return 0;
}

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273

C语言


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_STUDENTS 100
#define MAX_SUBJECTS 10
#define MAX_NAME_LEN 11

// 定义学生结构体
typedef struct {
    char name[MAX_NAME_LEN]; // 学生姓名
    int totalScore; // 学生总分
    int scores[MAX_SUBJECTS]; // 存储学生各科成绩的数组
} Student;

// 定义全局变量
int n, m; // n为学生数量,m为科目数量
char subjects[MAX_SUBJECTS][MAX_NAME_LEN]; // 存储科目名称的数组
Student students[MAX_STUDENTS]; // 存储学生对象的数组
char rankSubject[MAX_NAME_LEN]; // 用作排名的科目名称

// 定义比较函数,用于 qsort 函数
int cmp(const void *a, const void *b) {
    Student *studentA = (Student *)a;
    Student *studentB = (Student *)b;
    int scoreA = studentA->totalScore;
    int scoreB = studentB->totalScore;
    if (strcmp(rankSubject, "") != 0) {
        for (int i = 0; i < m; ++i) {
            if (strcmp(rankSubject, subjects[i]) == 0) {
                scoreA = studentA->scores[i];
                scoreB = studentB->scores[i];
                break;
            }
        }
    }
    if (scoreA != scoreB) {
        return scoreB - scoreA; // 成绩高的排前面
    }
    return strcmp(studentA->name, studentB->name); // 成绩相同则按姓名字典序排列
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        scanf("%s", subjects[i]);
    }

    for (int i = 0; i < n; ++i) {
        scanf("%s", students[i].name);
        students[i].totalScore = 0;
        for (int j = 0; j < m; ++j) {
            scanf("%d", &students[i].scores[j]);
            students[i].totalScore += students[i].scores[j];
        }
    }

    scanf("%s", rankSubject);

    // 对学生进行排序
    qsort(students, n, sizeof(Student), cmp);

    // 输出排序后的学生姓名
    for (int i = 0; i < n; ++i) {
        printf("%s ", students[i].name);
    }
    printf("\n");

    return 0;
}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
#牛客创作赏金赛#

主要记录自己的刷题日常,学而时习之。

全部评论

相关推荐

是重庆的一本也是华为的目标院校之一,收到hw的面试通知了,还要去吗?面试不一定过,就算进了池子也几乎泡不出来。bg,双非本,无实习,无论文,只有一些竞赛奖项。
谁教教我电磁场啊:去了挺好,答不出来最多也就尴尬一下,又不会少块肉。而且面经还挺重要的,还能学点东西,我技术面的时候不太清楚的问题那个面试官直接给我讲了一遍
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务