应届生简历超华丽,985各种奖项,玩过上千Github开源项目,入职一周,最基本的要求都完成不了。。。
简历看着像开挂,实战操作像开摆。
组里新来的应届生,985本硕、竞赛奖一箩筐、Github项目星光闪闪,我一开始都怀疑是不是隔壁组偷偷挖了个天才过来。结果一上手代码,连个按钮响应都写不明白,调接口能把QA调到抑郁。
产品天天在群里灵魂拷问:“这个也不会?你不是顶尖大学的吗?”我看那表情,像是买了个保时捷,结果一上路发现是手摇启动的三蹦子。
我现在有点搞不清,这到底是简历写得太艺术,还是我老了,看不懂新时代选手的操作方式了?反正HR那边是该装个显卡识别简历了,不然这GPU级别的光环,落地连Excel都跑不动,真的太费电。
算法题:有效的数独
今天我们要聊的正是如何通过编程来解决数独问题。给大家介绍的是一道经典的算法题——有效的数独。
咱们得搞清楚题目要求。
有效的数独是这样的:给你一个 9x9 的二维数组,这个数组表示一个数独棋盘,其中空格用 '.' 表示,已填充的数字是 1 到 9。
我们要做的,就是判断这个数独是否有效。有效的数独,意味着以下几点:
每一行的数字 1-9 不能重复。 每一列的数字 1-9 不能重复。 每一个 3x3 的子网格内,数字 1-9 不能重复。
好,既然了解了问题的本质,咱们可以来写代码了。
考虑到题目并没有要求我们填充数独,而只是检查有效性,所以我们可以通过对每一行、每一列和每个子网格进行遍历来检查是否满足有效性条件。
我们可以通过三个 set 来分别检查行、列、3x3 子网格中的数字是否重复。
具体的思路是:对于数独中的每个非空格数字,我们分别检查这个数字是否已经出现在对应的行、列和子网格里。
如果有重复的数字,说明数独无效,直接返回 False。如果全部检查完后没有重复,说明数独是有效的。
下面是 Python 的实现:
defisValidSudoku(board):
# 创建三个列表,用来保存行、列、子网格的数字是否重复 rows = [set() for _ in range(9)] cols = [set() for _ in range(9)] boxes = [set() for _ in range(9)]for i in range(9):for j in range(9): num = board[i][j]if num == '.':continue# 如果是空格,跳过# 判断当前数字是否在对应的行、列、子网格里已经存在 box_index = (i // 3) * 3 + (j // 3) # 计算当前数字所在的3x3子网格索引if num in rows[i] or num in cols[j] or num in boxes[box_index]:returnFalse# 如果重复,直接返回 False# 将当前数字添加到对应的行、列、子网格中 rows[i].add(num) cols[j].add(num) boxes[box_index].add(num)returnTrue# 如果所有检查通过,返回 True
这段代码的工作原理其实很简单。我们使用了三个列表,rows、cols 和 boxes,它们分别用于存储每一行、每一列、每个 3x3 子网格中已经出现过的数字。
我们遍历整个数独棋盘,每遇到一个非空格的数字,就检查它是否已经出现在当前的行、列或子网格中。
如果出现重复,直接返回 False,否则把这个数字加入对应的集合里。
每次检查的时间复杂度是 O(1),而我们要遍历整个棋盘,因此总的时间复杂度是 O(81),也就是 O(1),这对于数独棋盘来说是非常高效的。
空间复杂度方面,我们需要额外的空间来存储行、列和子网格中的数字,所以空间复杂度是 O(1),也是常数级别的。
当然了,这道题目给出的“有效性”检查本质上是一个集合问题,我们通过利用集合的去重性质,能够非常高效地解决这个问题。
有时候大家可能会好奇,为什么要用 set 这种数据结构呢?为什么不用 list 或者其他类型的容器呢?
其实,set 之所以适合,是因为它提供了平均 O(1) 的查找和插入效率,而 list 则需要 O(n) 的查找时间,效率较低。所以在这种需要频繁检查重复的场景下,set 是最佳选择。
数独作为一种经典的逻辑推理游戏,程序员们通过算法实现它的有效性验证,既能提升编程技巧,也能享受解题的乐趣。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。