一个被裁员的45岁中年男人,大儿子16岁,高一,小儿子9岁3年级房贷122万,月供11400元
刚刷到这个帖子,真有点笑不出来。
45岁中年男人,原来年薪不低,天天996,忙得像上了发条。结果去年7月一裁,补偿拿了十几万,看着不少,其实放到房贷、两个孩子、家里开销里,也就一阵风。
大儿子上高一,小儿子才三年级,房贷还剩一百多万,每个月一万出头往外扣。工作找了半年没着落,人一下从家里顶梁柱,变成天天买菜做饭、收拾家务的那个。
最扎心的是,他现在在家说话都小心,烟酒也停了,一天吃两顿,还不敢挑。老婆上班挣钱,脸色不好也能理解一点,但天天被数落,谁顶得住啊。
这事哪是“中年危机”四个字能盖过去的,根本就是生活把人按在地上摩擦。
学生名单一导进来,后台只给了几行文本,结果页面上要展示“各专业人数”。 这题看着不像算法,真写错了也挺烦:专业名里可能有空格,输入行里可能有重复学生,顺序还不能乱。
我一般先不急着上复杂结构。统计人数,这种题第一反应就是哈希表,也就是 Python 里的 dict。
假设输入长这样:
6
1001 张三 软件工程
1002 李四 计算机科学与技术
1003 王五 软件工程
1004 赵六 数据科学
1005 陈七 计算机科学与技术
1006 周八 软件工程
第一行是学生数量,后面每行是:学号、姓名、专业。
这地方有个小坑,别直接 split() 之后拿最后一列就完事了。要是专业名写成“计算机 科学与技术”,最后一列就乱了。更稳一点的写法是只切前两个字段,剩下的都当专业。
代码可以这么写:
from collections import OrderedDict
defcount_students_by_major(lines):
major_count = OrderedDict()
for raw in lines:
row = raw.strip()
ifnot row:
continue
parts = row.split(maxsplit=2)
if len(parts) < 3:
continue
student_no, student_name, major = parts
major = major.strip()
if major notin major_count:
major_count[major] = 0
major_count[major] += 1
return major_count
n = int(input().strip())
student_lines = [input() for _ in range(n)]
result = count_students_by_major(student_lines)
for major, count in result.items():
print(f"{major}{count}")
这段代码不花哨,但够用。
OrderedDict 这里不是必须的。Python 现在普通 dict 也能保持插入顺序,不过我在这种题里还是愿意写得明显一点:哪个专业先出现,输出时就先打印哪个专业。判题系统要是卡输出顺序,这个点很容易翻车。
核心逻辑其实就三步。
读一行学生信息,拆出专业。
去字典里找这个专业有没有出现过。
出现过就加一,没出现过就先放进去再加一。
如果输入题目要求按专业名称排序,那最后输出那里改一下就行:
for major in sorted(result):
print(f"{major}{result[major]}")
这题没必要搞数组下标映射,也没必要提前建一堆专业列表。因为专业名称本身就是 key,用字典直接数,代码最短,出错点也少。
复杂度也很简单。每个学生只扫一遍,时间复杂度是 O(n)。字典里最多存不同专业的数量,空间复杂度是 O(m),m 是专业种类数。
这种统计类题,别把注意力放在“算法多高级”上。真正容易错的地方反而是输入格式、专业名拆分、输出顺序。代码写得稳一点,比硬凑技巧强。