SWE · Coding

Meta 自定义字符排序:计数、重复与未指定字符

按给定字符优先序重排字符串,保留每个字符的出现次数,并明确未列字符顺序。

题目重点:按给定字符优先序重排字符串,保留每个字符的出现次数,并明确未列字符顺序。

题意与假设

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

  • order字符互不重复,只约束这些字符的相对优先顺序;text可含其他字符。
  • 训练把未指定字符放末尾并保留它们原相对顺序。实际题若允许任意次序,这个稳定策略仍合法;若需要放开头则调整规则。

解题路线

  1. 统计text频次,按order逐字符输出count份;再扫描原text,只输出不在order的字符。
  2. 未指定字符二次扫原文而非扫Counter,确保它们的相对位置稳定;指定字符之间的数量来自freq。
  3. 字符串拼接用列表/join,避免不断追加造成重复分配;即使字母表小,也不能只输出存在与否而丢重复。

手动走一遍

order=cba,text=abcdabx,计数c1/b2/a2,前半cbbaa;剩余dx原序,结果cbbaadx。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

from collections import Counter


def custom_sort_string(order, text):
    """Order characters are distinct; unspecified characters retain original relative order."""
    if len(set(order)) != len(order):
        raise ValueError('order characters must be distinct')
    counts=Counter(text)
    ranked=set(order)
    return ''.join(char*counts[char] for char in order)+''.join(char for char in text if char not in ranked)

复杂度

O(|order|+|text|)预期时间,O(U)频次数加O(n)输出,U为text不同字符数。

易错点与追问

容易失分的边界

  • order里重复字符会重复输出整组,因此明确拒绝重复优先项。
  • 按text原字典序sort会忽略给定优先序;需要rank映射或计数。

继续深挖

  • 若未指定字符也要字典序,末尾排序额外O(U log U)或O(n log n);不能维持相同复杂度声明。
  • 只需稳定按rank排序对象而不是字符,使用稳定sort并保留payload,成本O(n log n)。
✓已复制微信号!