NG SWE · Phone Screen Coding

Bloomberg Wordle 字符反馈:重复字母先精确匹配再分配

对 guess/target 输出位置正确、错位存在和不存在;用剩余字母频次防重复猜测全变黄。

题目重点:对 guess/target 输出位置正确、错位存在和不存在;用剩余字母频次防重复猜测全变黄。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版等长字符串,反馈 G=位置精确、Y=其他位置尚有同字母、X=不存在或配额已耗尽。
  • 大小写敏感;若题目把所有出现过的字母一律标为 Y,不考虑频次,则与标准 Wordle 不同,需确认。

解题路线

  1. 第一遍逐位标 G,未被 G 消耗的 target 字符记入频次表。
  2. 第二遍只看非 G 的 guess:若剩余目标频次>0,标 Y 并减一,否则 X。
  3. 精确匹配优先于黄色分配,因为一个 target 位置只能供一个 guess 字符使用。
  4. 边界测重复字母比 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?
  • 如何反馈给前端颜色?
  • 玩家猜词不在词典里怎么办?
✓已复制微信号!