同事接了一个紧急项目加班到凌晨,却被批评效率低。。
昨天刷朋友圈,看到前同事发了一条扎心动态:“加班到凌晨完成任务,结果早会上被批评效率低,这是什么操作?” 🤯
事情是这样的:他接了一个紧急项目,赶在客户的 deadline 前加班到凌晨,成功搞定需求。结果第二天早会上,领导当众来了一句:“要是效率高点,昨晚就不用熬夜了。”
但说实话,站在程序员的角度,这事儿真的两面都有理。加班赶工确实累人,效率低下也是问题。但问题是:如果需求能早点明确,资源分配更合理,还至于熬夜么? 😤
有时候,不是效率的问题,而是决策问题。毕竟,谁也不想拿健康换 KPI,对吧?【备注:文末可领最新资料】
算法题:黑板异或游戏
今天我们聊点有意思的——一道叫黑板异或游戏的算法题。
题目的背景大概是这样的:有一群数字排成了队,两个玩家轮流从队伍里选一个数,然后把它从队伍里剔除。游戏的目标是让剩下的数字进行异或运算,结果为0。显然,谁能让对方无路可选,谁就赢了。
我第一眼看到这题的时候,脑子里出现了四个字:“异或成精”。这玩意平时调试都够头疼,现在还要用它赢比赛,真是程序员的快乐源泉啊。
程序员的异或小课堂
先复习一下异或运算的特点:
交换律和结合律:(a \oplus b = b \oplus a),((a \oplus b) \oplus c = a \oplus (b \oplus c))。 任何数和0异或还是它自己:(a \oplus 0 = a)。 同一个数异或两次,结果是0:(a \oplus a = 0)。
这些性质看着简单,但用起来贼难顶。尤其是遇到这种动态博弈题的时候,脑袋容易短路。不过别慌,咱们程序员有自己的分析工具。
题目分析
要搞定这题,先想明白一个问题:什么时候异或结果是0?
如果当前所有数字的异或值是0,意味着无论谁操作,最终都会让对方无法获胜。 如果异或值不是0,那只要通过某种操作让对手陷入“异或值为0”的状态,就能掌握主动权。
接下来,我们需要从数学角度分析一下玩家的选择策略。游戏规则其实有两个关键点:
如果数组长度是偶数,先手玩家总是可以通过适当选择获胜。 如果数组长度是奇数,先手玩家只能在初始异或值不为0时获胜。
为啥会这样呢?别急,咱用代码和分析解释一波。
代码实现
先上个Python代码,直观感受一下问题的解法:
defxorGame(nums):
# 计算整个数组的异或值
xor_sum = 0
for num in nums:
xor_sum ^= num
# 如果异或值为0,先手必赢
if xor_sum == 0:
returnTrue
# 如果数组长度是偶数,先手也必赢
return len(nums) % 2 == 0
# 测试用例
nums1 = [1, 1, 2] # 输出:False
nums2 = [1, 1, 2, 2] # 输出:True
print(xorGame(nums1))
print(xorGame(nums2))
这段代码主要分三步:
计算数组的整体异或值。 如果异或值已经是0,先手玩家直接赢了。 如果异或值不为0,判断数组长度。如果长度是偶数,先手玩家仍然可以稳操胜券;否则,后手玩家会有优势。
这类博弈题的魅力就在于,不仅考察你对算法的理解,还逼着你站在对方的视角,去模拟对手的策略。写完代码后,我脑补了一下如果我和朋友真玩这种游戏,大概率会先吵起来,因为异或值怎么算都没那么直观😂。
不过,学会了这个算法,我觉得以后写游戏AI应该能派上用场。毕竟异或运算又快又好用,运气好的话还能拿它加密个小文件,给领导演示一下“自己开发了个新算法”。只要领导别问太细,我的代码就能过关😎。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。