乐信圣文后端面试题-成绩排序
考察公司:乐信圣文
考察时间:2025.7.16
题目
有如下结构的json 字符串, 根据成绩输出每个班级学生的名次.
1
"{\"一班\":{\"张小丙\":87,\"张小甲\":98,\"张小乙\":90},\"二班\":{\"王七六\":76,\"王九七\":97,\"胡八一\":81,\"王六零\":60,\"刘八一\":81,\"李八一\":81}}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"一班": {
"张小丙": 87,
"张小甲": 98,
"张小乙": 90
},
"二班": {
"王七六": 76,
"王九七": 97,
"胡八一": 81,
"王六零": 60,
"刘八一": 81,
"李八一": 81
}
}
题目解释
每个班级分别排名.
分数相同的时候名次相同.
当出现相同分数的情况下, 名次并不连续. 既排名在两个并列第一之后的学生名次是第三, 排名在三个并列第一之后的学生名次是第四.
输出示例(不需要考虑输出顺序):
1
2
3
4
5
6
7
8
9
10
一班 张小丙 第3名
一班 张小甲 第1名
一班 张小乙 第2名
二班 王七六 第5名
二班 王九七 第1名
二班 胡八一 第2名
二班 王六零 第6名
二班 刘八一 第2名
二班 李八一 第2名
要求
可以使用自己习惯的IDE开发, 可以使用Golang/Python/JS/TS/java完成题目.
做题过程中可以调试, 可以使用搜索引擎但不能使用AI工具(例如ChatGPT或Copilot)
如果对题目存在疑问可以同面试官讨论
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
package main
import (
"encoding/json"
"fmt"
"sort"
)
func main() {
/*
{
"一班": {
"张小丙": 87,
"张小甲": 98,
"张小乙": 90
},
"二班": {
"王七六": 76,
"王九七": 97,
"胡八一": 81,
"王六零": 60,
"刘八一": 81,
"李八一": 81
}
}
*/
jsonStr := "{\"一班\":{\"张小丙\":87,\"张小甲\":98,\"张小乙\":90},\"二班\":{\"王七六\":76,\"王九七\":97,\"胡八一\":81,\"王六零\":60,\"刘八一\":81,\"李八一\":81}}"
// 定义反序列化结构:map[班级名]map[学生名]成绩
var data map[string]map[string]int
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println("json unmarshal err:", err)
return
}
for className, studentScores := range data {
type student struct {
name string
score int
}
var students []student
for name, score := range studentScores {
students = append(students, student{name: name, score: score})
}
// 按成绩降序排序
sort.Slice(students, func(i, j int) bool {
return students[i].score > students[j].score
})
// 计算名次
rank := 1
for i := 0; i < len(students); i++ {
if i > 0 && students[i].score == students[i-1].score {
// 同名分数不变
} else {
rank = i + 1
}
fmt.Printf("%s %s 第%d名\n", className, students[i].name, rank)
}
fmt.Println()
}
}
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用