1004 成绩排名 (20 分)
题目描述:
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
… … …
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
解题思路:
根据题意,本题的核心问题是求一个数组中的最大值和最小值。用打擂台算法可以直接求解。所谓打擂台算法就是通过遍历数组与数组中每个元素比大小的方式来找出最大值和最小值。
如:
def get_max(array)
# array 是非空数组
maxx = array[0]
for x in array:
if x > maxx:
maxx = x
return maxx
由于题目中要求输出的是最大值和最小值对应的学生信息,所以找到最大值和最小值对应的下标,然后在利用下标找到最大值最小值对应的学生信息输出即可。或者直接记录最小值最大值对应的学生信息然后输出即可。
代码:
- Python Version
def main():
n = int(input())
# 接收输入的整数
data = []
# 存储要输入的学生信息为字符串列表
for x in range(n):
data.append(input())
# 输入后data 形如["Joe Math990112 89", "Mike CS991301 100", "Mary EE990830 95"]
minn = float('inf')
# python 中存在无穷大的概念,得到一个无穷大的方式之一就是 float('inf')
maxx = -1 * minn
# 在打擂台算法中通常我们将最大值的初始值设置为负无穷大,将最小值的初始值设置为无穷大。请自己思考为什么这样做??
minn_index = maxx_index = 0
for x in range(n):
temp = int(data[x].split(' ')[-1])
"""
字符串的split()方式将字符串按照指定的分隔符分割为子串的列表。如“I am Cool”.split(" ") -> ['I', 'am', 'Cool']。
得到子串组成的列表后,我们可以通过下标获取指定的元素。不同于静态类型语言(Java, C++等)python 的列表支持下标为负,
其中array[-1]表示array的最后一个元素,-2表示倒数第2个元素,以此类推。
所以,data[x].split(' ')[-1] 就是取出 第x 个用空格分隔的学生信息并获取最后一个子串,在本题中就是分数。
最后,通过类型转换将分数从字符串变为整数就好了。
"""
if temp > maxx:
maxx = temp
maxx_index = x
if temp < minn:
minn = temp
minn_index = x
# 使用打擂台算法找到最大分数和最小分数对应的下标
print(" ".join(data[maxx_index].split(' ')[:-1]))
print(" ".join(data[minn_index].split(' ')[:-1]))
# 按顺序打印出最大分数和最小分数学生的信息。
"""
data[maxx_index].split(' ')返回一个子串的列表,然后我们使用索引的方法找出其中我们需要的部分。
array[a:b] 的作用是返回array中下标从a开始(包括a)到b结束(不包括b)的元素组成的列表。
如 array = ['I', 'am', 'Cool']; array[0:-1]就是['I', 'am']。当a 或者 b 是 0 的时候可以省略不写。
所以 data[maxx_index].split(' ')[:-1]就是不包括最后一项(分数)的子串组成的列表。
最后使用字符从的join方法将子串使用我们需要的分隔符(本题中是空格)拼接起来。
"""
if __name__ == '__main__':
main()
C++ Version
#include <iostream>
#include <string>
using namespace std;
int main(){
//freopen("in.txt","r", stdin);
int N = 0;
cin >> N;
int maxx_score = -1;
int minn_score = 1000;
string name, id, max_name, max_id, min_name, min_id;
int score;
for(int i=0;i<N;++i){
cin >> name >> id >> score;
if(score > maxx_score){
maxx_score = score;
max_name = name;
max_id = id;
}
if(score < minn_score){
minn_score = score;
min_name = name;
min_id = id;
}
}
cout << max_name << " " << max_id << endl;
cout << min_name << " " << min_id << endl;
return 0;
}
- Java Version:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
// 接收输入的一个整数
String[] first = {"", ""};
String[] last = {"", ""};
int maxx = -1;
int minn = 110;
for(int i=0; i<n; ++i) {
String name_str = in.next();
// 接收输入的名字 字符串。next() 方法从输入流中读入一个字符串,遇到空格或回车结束。
String course_str = in.next();
// 接收输入的课程名字
int score = in.nextInt();
// 接收输入的成绩
if(score > maxx) {
maxx = score;
first[0] = name_str;
first[1] = course_str;
}
if(score < minn) {
minn = score;
last[0] = name_str;
last[1] = course_str;
}
// 打擂台算法求最大值和最小值
}
System.out.println(first[0] + " " + first[1]);
System.out.println(last[0] + " " + last[1]);
// 按格式输出答案
}
}
- JavaScript Version:
const readline = require('readline');
const fs = require('fs');
function main(){
var line_counter = 0;
var max_score = 0;
var min_score = 1000;
var max_name = '';
var min_name = '';
var max_course = '';
var min_course = '';
var n = 0;
const io = readline.createInterface({
input: process.stdin,
//input: fs.createReadStream("in.txt"),
// output: process.stdout,
});
io.on('line', (input_string)=>{
if(line_counter == 0){
n = parseInt(input_string);
}else{
var tmp = input_string.split(" ");
if(parseInt(tmp[2]) > max_score){
max_score = parseInt(tmp[2]);
max_name = tmp[0];
max_course = tmp[1];
}
if(parseInt(tmp[2]) < min_score){
min_score = parseInt(tmp[2]);
min_name = tmp[0];
min_course = tmp[1];
}
}
line_counter += 1;
//console.log(input_string);
if(line_counter == n + 1){
console.log("%s %s", max_name, max_course);
console.log("%s %s", min_name, min_course);
}
});
}
main();
易错点:
- 注意题目要求的输出格式
总结:
- 在日常的coding中,对字符串的处理是必不可少的。所以尽量掌握一些关于字符串的常用函数可以帮助我们提高编码效率。
- Python 列表的强大之处就在于多种多样的索引方法和列表推导。关于这些技巧,多写,多记笔记都是掌握它们的好方法。
-