输出每个成绩在全班所有成绩中的排名
温馨提示:
本文最后更新于 2022年10月25日,已超过 712 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
题目
现在老师手上有本班成绩单列表,列出了班级里每个同学的考试成绩,是无序排列的,
现在要求输出每个成绩在全班所有成绩中由高到低的排名,排名最高的从1开始
需要考虑成绩相同并列排名的情况
输入
一个整数数组,每个元素表示一个学生考试成绩
输出
一个整数数组,每个元素是输入数组对应元素在全班成绩的排名
输入样例
[99,89,92,89,85]
输出样例
[1,3,2,3,5]
实现思路
先通过一种排序方式把输入的成绩进行排序
然后挨个遍历没有进行排序的成绩,在已排序的成绩找到它,在第几个找到那么该成绩的排名就是多少
最后需要注意的是,相同的成绩排名相同,通过map来实现的,key为成绩,value为该成绩的排名
详细看代码,结合注释应该可以很好的理解
代码实现
@Test
public void test02() {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] split = str.substring(1, str.length() - 1).split(",");
int [] input = new int[split.length]; // 用于排序的数组
int[] copyInput = new int[split.length]; // 复制一份原数组
for (int i = 0; i < split.length; i++) {
input[i] = Integer.valueOf(split[i]);
copyInput[i] = Integer.valueOf(split[i]);
}
int[] orders = new int[input.length]; // 各个成绩的排名
HashMap map = new HashMap(); // 通过map来保存相同成绩的排名
// 冒泡排序
for (int i = 0; i < input.length; i++) {
for (int j = i+1; j < input.length; j++) {
if (input[i]< input[j]) {
int tmp = input[i];
input[i] = input[j];
input[j] = tmp;
}
}
}
// 需要输出排序前各个成绩的排名,所以需要有排序前各个成绩
for (int i = 0; i < copyInput.length; i++) {
// 遍历排序前每个成绩,并从排序后的数组找找到改成绩,在第几个找到它的排名就是多少
for (int j = 0; j < input.length; j++) {
if (copyInput[i] == input[j]) {
if (map.containsKey(copyInput[i])) { // 先从map中查找是否有相同成绩
orders[i] = (int) map.get(copyInput[i]); // 有的话就和之前的排名相同
break;
}
orders[i] = j+1;
map.put(copyInput[i], j+1); // 找到改成绩将其加到map中并存它的排名
break;
}
}
}
StringBuffer sb = new StringBuffer("[");
for (int i = 0; i < orders.length; i++) {
sb.append(orders[i]);
if (i != orders.length-1) {
sb.append(",");
}
}
sb.append("]");
System.out.println(sb);
}
最后,祝各位程序猿节日快乐!!!
正文到此结束
- 本文标签: 算法
- 本文链接: https://www.it1997.com/article/109
- 版权声明: 本文由小陈没烦恼原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权