SWE / MLE · CodeSignal OA

Capital One 有序片段拼接:重复值与不同下标计数

OA 题给数字/字符串片段和目标串,按有序下标 pair 统计拼接相等;重复 12 有两种方向,不能按值去重。

题目重点:OA 题给数字/字符串片段和目标串,按有序下标 pair 统计拼接相等;重复 12 有两种方向,不能按值去重。

题意与假设

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

  • 每个输入转成十进制/原字符串表示后拼接;若整数有负号/前导零,应先确认格式。
  • pair=(i,j),i≠j,顺序不同算不同;同值不同下标仍是不同候选。
  • 空片段是否允许未披露;训练版允许字符串,但如目标为空需小心计数。

解题路线

  1. 直接 oracle 是两重循环遍历所有 i≠j,比对 str(a[i])+str(a[j])==target,O(n²L),先用它验证优化版。
  2. 优化先建 Counter<fragment,frequency>。对每个左片段 x,若 target 以 x 开头,右片段 y=target[len(x):],加 frequency[y];若 x==y,再减去当前 i 自己一次,避免 i=j。
  3. 每个原始下标都迭代一次,因此重复 x 自然产生多次计数;对 x=12 两个位置、y=12,分别加 2−1=1,总 2。
  4. 若 target 很长而片段短,可预先只处理长度≤target 长度的片段;字符串切片/前缀成本需计入复杂度,不简单声称纯 O(n)。
  5. 测 source 示例、同一元素不能复用、全相同片段、空/不可匹配与数值 0/前导零。

手动走一遍

列表 [1,212,12,12] 转串。1 的补串是 212,贡献 1;两个 12 各自的补串是 12,但自己不能作右项,各贡献 1;212 不是 target 前缀。总数 3。

规模与取舍

n 个片段、目标长度 T、片段总字符数 S:频次表 O(S) 空间;逐片段前缀/切片朴素最坏 O(nT) 时间,哈希查找预期 O(1),总 O(S+nT);两重枚举 oracle 为 O(n²T)。

易错点与追问

容易失分的边界

  • 把 unordered pair 除以 2,丢 1+212 与可能的反向差异。
  • 用 set 去重导致两个 12 的贡献丢失。
  • x==y 时把同一下标与自己配对。
  • 把数字相加误当字符串拼接。
  • 说 O(n) 却忽略构建/比较字符串长度。

继续深挖

  • 返回具体 pair 下标怎么做?
  • 多个 target 一起查怎样预处理?
  • 允许片段重复使用同一位置时公式怎么变?
  • 片段非常长时如何避免大量切片?
✓已复制微信号!