Python技术迷

隔壁部门同事,去年提离职后,绩效考核被打了个C,年终奖直接从5万降到1万。后来才知道,他提完离职就开始摸鱼,项目交接敷衍了事

刚看到个贴子,说有网友吐槽:隔壁部门同事去年提了离职,结果绩效被打C,年终从5万变1万。后面才知道,人家提完就开始疯狂摸鱼,交接随便糊弄,拖累后续同事,搞到整个部门KPI都没完成。

Image

提离职是你的自由,但在走之前把本职工作做好,是基本的职业道德。就像你在菜市场买菜,付了整袋的钱,结果摊主只给你半袋,你肯定也不乐意。公司给的是一整年的工资和奖金,你后几个月摆烂,那总得有人为结果买单。

从我的角度看,这事最该长记性的其实是我们这些还在职场里打工的人:要走可以,但别砸自己的牌子。

路还长,口碑是会绕个圈子再回到你身上的。

算法题:变为棋盘

昨晚十一点多我在楼下抽烟,隔壁组小李跑过来问我个题,说面试官盯着他写“变为棋盘”,他写着写着把自己写崩了……我说你别慌,这题看着像“交换行列”这种花活,其实就两个点:能不能变,能变的话最少换几次。你把它当成“线上配置下发的两套模板”,一套是 0101… 另一套是 1010…,所有行只能是模板A或模板B,不然就一定乱套。

先说能不能变,最狠的判定其实一句话:任意一个 2x2 小方块,四个角的异或必须为 0。你想啊,真正棋盘里,左上和右下相同,右上和左下相同,所以 a^b^c^d 必须是 0。用第一行第一列当锚点,扫一遍就行:board[0][0]^board[i][0]^board[0][j]^board[i][j] 只要出现 1,直接 -1,别挣扎。

能变之后算最少交换次数,这里很多人卡住,老想着模拟 swap。别模拟,算“错位数”就行: 比如列应该是 0/1/0/1…,你数一下当前第一行的列值,跟理想模式比,有多少位置不一样,那些就是需要靠交换去修的“错位”。一次交换能修两个错位,所以最后 /2。行同理,用第一列算。

还有个小坑:n 是奇数的时候,起始模式只能选一种(因为 0 的个数和 1 的个数必须差不超过1),所以“取 min”要带条件,不然会选到不可能的那套。

我把代码给小李发过去了,他说看着就像我平时骂人的语气……行吧你们也拿去用,Python 版,自己写的,别拿去背题就行哈:

from typing import List

defmoves_to_chessboard(board: List[List[int]]) -> int:
    n = len(board)

# 1) 可行性:任意(i,j)满足  board00 ^ boardi0 ^ board0j ^ boardij == 0
    b00 = board[0][0]
for i in range(n):
for j in range(n):
if (b00 ^ board[i][0] ^ board[0][j] ^ board[i][j]) != 0:
return-1

# 2) 统计第一行/第一列 1 的个数,必须在 [n//2, (n+1)//2] 之间
    row_sum = sum(board[0][j] for j in range(n))
    col_sum = sum(board[i][0] for i in range(n))
    lo, hi = n // 2, (n + 1) // 2
ifnot (lo <= row_sum <= hi and lo <= col_sum <= hi):
return-1

# 3) 计算第一行/第一列与两种理想模式的错位数
#    pattern0: 0,1,0,1,...  (index%2)
#    pattern1: 1,0,1,0,...
defmismatches_line(get_value):
        mis0 = 0
for i in range(n):
if get_value(i) != (i % 2):
                mis0 += 1
        mis1 = n - mis0
if n % 2 == 0:
return min(mis0, mis1)
# n为奇数:只能选错位数为偶数、且对应1的数量合法的那一种
return mis0 if (mis0 % 2 == 0) else mis1

    col_mis = mismatches_line(lambda j: board[0][j])  # 列错位:看第一行
    row_mis = mismatches_line(lambda i: board[i][0])  # 行错位:看第一列

# 一次交换修两个错位
return (col_mis + row_mis) // 2


# 小测一下(你也可以自己换数据)
if __name__ == "__main__":
    b = [
        [0, 1, 0],
        [1, 0, 1],
        [0, 1, 0],
    ]
    print(moves_to_chessboard(b))  # 0

反正这题你就记住一句人话:先把“是不是同一套模板/反模板”确认了,再算“模板错位有多少”。别上来就 swap,swap 是最后不得已才干的活儿。

哎对了,刚说到抽烟,小李还顺手把我打火机顺走了,我现在还没找到是谁拿的,离谱…算了不说了。