华为机试-068-较难-HJ68.成绩排序
一、描述
给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
注:0代表从高到低,1代表从低到高
1.1、输入描述
- 第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开
1.2、输出描述
- 按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
二、示例
2.1、示例1
输入:
3
0
fang 90
yang 50
ning 70
输出:
fang 90
ning 70
yang 50
2.2、示例2
输入:
3
1
fang 90
yang 50
ning 70
输出:
yang 50
ning 70
fang 90
三、答案(java)
3.1、方法一
package com.tzq.hwod;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
//注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<Integer, String> map = new HashMap<>();
while (sc.hasNextLine()) {
int n = Integer.parseInt(sc.nextLine());
int flag = Integer.parseInt(sc.nextLine());// 1是升序,0是降序
int[][] score = new int[n][2];// 姓名编号,成绩
for (int i = 0; i < n; i++) {
String[] nameAndScore = sc.nextLine().split("\\s+");
score[i][0] = i;
score[i][1] = Integer.parseInt(nameAndScore[1]);
map.put(i, nameAndScore[0]);
}
Arrays.sort(score, (o1, o2) -> {
if (flag == 0) {
return o2[1] - o1[1];// 按第二列降序排列,如果相等的话,返回0,顺序不变
} else {
return o1[1] - o2[1];// 按第二列升序
}
});
for (int i = 0; i < n; i++) {
System.out.println(map.get(score[i][0]) + " " + score[i][1]);
}
}
}
}
四、答案(python 3)
4.1、方法一
#!/usr/bin/python
# -*- coding: UTF-8 -*-
while True:
try:
n, order = int(input()), int(input())
data = [] # 不能用字典保存,因为可能有名字是重复的
for _ in range(n):
name, score = input().split()
data.append((name, int(score)))
if order:
for i in sorted(data, key=lambda x:x[1]): # 升序
print(i[0], i[1])
else:
for i in sorted(data, key=lambda x:x[1], reverse=True): # 降序
print(i[0], i[1])
except:
break