乐信圣文后端面试题-成绩排序

考察公司:乐信圣文

考察时间: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. 当出现相同分数的情况下, 名次并不连续. 既排名在两个并列第一之后的学生名次是第三, 排名在三个并列第一之后的学生名次是第四.

输出示例(不需要考虑输出顺序):

1
2
3
4
5
6
7
8
9
10
一班 张小丙 第3名
一班 张小甲 第1名
一班 张小乙 第2名

二班 王七六 第5名
二班 王九七 第1名
二班 胡八一 第2名
二班 王六零 第6名
二班 刘八一 第2名
二班 李八一 第2名

要求

  1. 可以使用自己习惯的IDE开发, 可以使用Golang/Python/JS/TS/java完成题目.

  2. 做题过程中可以调试, 可以使用搜索引擎但不能使用AI工具(例如ChatGPT或Copilot)

  3. 如果对题目存在疑问可以同面试官讨论

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()
	}
}

image-20250716173016109

本文作者:
本文链接: https://hgnulb.github.io/blog/2025/40155716
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!