隔壁组的正式员工下午茶点了奶茶,唯独没有外包员工的,可项目核心逻辑全是这外包兄弟扛下来的
刚看到个贴子,说隔壁组下午茶点奶茶,正式员工人手一杯,偏偏没外包的份。但项目里最难啃的核心逻辑,基本都是这位外包兄弟在扛。
我觉得这事吧,真挺现实的。制度上你是“外人”,贡献上你却是“主力”,这种反差在不少公司都存在。
网友回帖里有人骂不公平,有人劝外包别太走心
不过话说回来,长期让真正干活的人没存在感,其实也挺短视的。今天是一杯奶茶,明天可能就是责任和风险全压给你,收益却没你的份。时间一长,谁还愿意死扛?
这事提醒打工人两点:一是别指望职场的“公平感”来自善意,更多还是靠规则;二是看清自己的位置,值不值得继续投入。想明白了,心就不会被一杯奶茶牵着走,路也能走得更稳。
面试题:学生地理信息报告
我们先想象个场景哈:班主任在群里说一句——“谁帮我统计下全校哪个省来的学生最多,再顺便看看每个省里哪个城市来的学生最多?” 听起来就很像一份「学生地理信息报告」对吧,而且如果靠 Excel 手搓,数据一多绝对崩溃。
假设我们有一堆学生记录,每条长这样:
姓名:name 班级:clazz 省份:province 城市:city
现在要做几件事:
统计每个省有多少学生 省内再按城市统计人数 能按省份查:这个省下各城市的学生数,按人数从多到少排 最后生成一份好读的文本/控制台报告
其实就是把一堆“明细行”变成“分组统计 + 排序”的经典题,在真实业务里也是日志、订单、访问记录之类经常干的事。
数据结构怎么设计更顺手
Python 里最自然的就是用字典嵌套字典。
我们可以设计一个这样的结构:
from collections import defaultdict
# 省份 -> 城市 -> 学生列表
province_city_students = defaultdict(lambda: defaultdict(list))
读每个学生的时候,就往里塞:
defbuild_index(students):
for stu in students:
p = stu["province"]
c = stu["city"]
province_city_students[p][c].append(stu["name"])
有了这个结构,统计人数就轻松了:
每个省的人数 = 该省所有城市学生列表长度之和 每个城市的人数 = 对应列表长度 想按人数排序,就在统计完之后 sorted一下
这种“先建索引再统计”的思路,在日志分析、MQ 消费统计那种场景也特别常见。
核心算法流程
把题目翻译成算法大概是这样几步:
遍历所有学生记录,构建
province_city_students索引再扫一遍这个索引,算出:
每个省的总人数 每个省里各城市的人数
对结果做排序:
省份按总人数从多到少 每个省内部城市按人数从多到少
把这些结果格式化成一段可读的报告字符串
时间复杂度很好算:
构建索引:每个学生处理一次,O(N)
后面统计和排序:
统计仍然是 O(N) 排序最多是省数量 * log(省数量) + 城市数量 * log(城市数量),一般来说比 N 小很多
整体就是 O(N log N),对动不动几万学生的数据完全够用。
Python 代码示例
直接上一个相对完整、能跑的示例,你可以按自己需要改输入来源(比如从文件/数据库读):
from collections import defaultdict
from typing import List, Dict
Student = Dict[str, str]
defbuild_report(students: List[Student]) -> str:
# 省 -> 城市 -> 学生名字列表
province_city_students: Dict[str, Dict[str, List[str]]] = \
defaultdict(lambda: defaultdict(list))
for stu in students:
p = stu["province"]
c = stu["city"]
province_city_students[p][c].append(stu["name"])
# 省份统计:省 -> 总人数
province_total = {}
# 省内城市统计:省 -> [(城市, 人数)]
province_city_stats = {}
for province, city_map in province_city_students.items():
total = 0
city_stats = []
for city, names in city_map.items():
cnt = len(names)
total += cnt
city_stats.append((city, cnt))
province_total[province] = total
# 每个省内按人数从多到少,人数相同按城市名字母序
city_stats.sort(key=lambda x: (-x[1], x[0]))
province_city_stats[province] = city_stats
# 省份按人数排序
sorted_provinces = sorted(
province_total.items(),
key=lambda x: (-x[1], x[0])
)
# 组装成文本报告
lines = []
lines.append("学生地理信息报告\n")
for province, total in sorted_provinces:
lines.append(f"省份:{province},学生总数:{total}")
for city, cnt in province_city_stats[province]:
lines.append(f" - 城市:{city},学生数:{cnt}")
lines.append("") # 空行分隔一下
return"\n".join(lines)
if __name__ == "__main__":
sample_students = [
{"name": "张三", "clazz": "高一1班", "province": "广东", "city": "广州"},
{"name": "李四", "clazz": "高一2班", "province": "广东", "city": "深圳"},
{"name": "王五", "clazz": "高一1班", "province": "广东", "city": "广州"},
{"name": "赵六", "clazz": "高一3班", "province": "浙江", "city": "杭州"},
{"name": "小红", "clazz": "高二1班", "province": "浙江", "city": "宁波"},
]
report = build_report(sample_students)
print(report)
这段代码做的事就是上面说的那几步:先按省+市分桶,再统计、排序,最后输出一份可读性还不错的报告。在真实项目里,你可以把 print 换成写文件、推送到接口、或者生成成 PDF 都行。
你可以先用这份代码跑一跑,确认逻辑没问题,再根据实际题目要求加点花活,比如:
再统计一下每个班级在各省的分布 只展示前 K 个省、前 K 个城市 把「省份不足 X 人」的直接隐藏
这种题一旦数据结构选对了,改需求就会很丝滑。你要是愿意,我们还能在这基础上写个简单的可视化版本,把省市统计画成柱状图。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB