题目重点:对 guess/target 输出位置正确、错位存在和不存在;用剩余字母频次防重复猜测全变黄。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版等长字符串,反馈 G=位置精确、Y=其他位置尚有同字母、X=不存在或配额已耗尽。
- 大小写敏感;若题目把所有出现过的字母一律标为 Y,不考虑频次,则与标准 Wordle 不同,需确认。
解题路线
- 第一遍逐位标 G,未被 G 消耗的 target 字符记入频次表。
- 第二遍只看非 G 的 guess:若剩余目标频次>0,标 Y 并减一,否则 X。
- 精确匹配优先于黄色分配,因为一个 target 位置只能供一个 guess 字符使用。
- 边界测重复字母比 target 多、全绿、全无、长度不等。
手动走一遍
guess=‘AAB’,target=‘ABC’:位置 0 的 A 是 G;剩余目标 B,C,不再有 A,所以位置 1 的 A 是 X;位置 2 的 B 错位且剩余有 B,为 Y,输出 GXY。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
from collections import Counter
def wordle_feedback(guess, target):
"""G exact, Y present elsewhere, X absent/exhausted."""
if len(guess) != len(target):
raise ValueError("words must have equal length")
result = ["X"] * len(guess)
remaining = Counter()
for i, (candidate, actual) in enumerate(zip(guess, target)):
if candidate == actual:
result[i] = "G"
else:
remaining[actual] += 1
for i, candidate in enumerate(guess):
if result[i] == "X" and remaining[candidate] > 0:
result[i] = "Y"
remaining[candidate] -= 1
return "".join(result)
复杂度
n 字符两遍,O(n) 时间;频次 O(字符集大小),输出 O(n) 空间。
易错点与追问
容易失分的边界
- 先做存在性判断导致被精确匹配的字母重复标黄。
- 只用 target 集合,忽略重复字母配额。
- 没有定义长短不一输入。
- 把训练 G/Y/X 当作题目指定编码。
继续深挖
- 支持 Unicode grapheme 而非 code point?
- 如何反馈给前端颜色?
- 玩家猜词不在词典里怎么办?
