目录
正在加载目录...

Bcg X DS OA 新题 | Bcg X DS Codesignal 4题 分享

Bcg X DS OA 新题 | Bcg X DS Codesignal 4题 分享

刚刚结束一场 BCG X ds OA ,一小时内顺利完成。整体感受是:不难,但比纯算法题更考细节和工程习惯。 BCG 隔段时间就会换几套题的,题量大,难度还行,重要的是逻辑写清楚,边界处理好。我把每道题的思路拆开了,都贴在图片了,给大家一点参考。 现在很多北美大厂,题目都在往“细节密集 + 时间压缩”方向走。很多同学平时刷题没问题,但一到正式 OA 就节奏失控、边界漏掉、格式出错,最后差一点点。差的往往不是能力,而是临场稳定性。

Bcg X DS OA 新题分享

Q1:

题目:要求实现一个字符串压缩算法:从左到右扫描字符串,将连续相同的字符分组,如果某个字符只出现一次,则直接输出该字符;如果连续出现多次,则输出“字符 + 出现次数”。例如 "aabbccca" 压缩后为 "a2b2c3a"。字符串只包含小写字母,长度不超过 10510^5,要求按顺序完成分组与拼接。

思路:从左到右扫一遍字符串,用一个计数器统计连续相同字符的个数,遇到新字符就把上一个字符和次数(大于 1 才加数字)拼到结果里即可。

代码:

def compressedString(message):
    if not message:
        return ""
    p = message[0]   # 当前字符
    c = 1            # 当前字符计数
    r = []           # 结果列表
    for ch in message[1:]:
        if ch == p:
            c += 1
        else:
            # 如果计数大于1,拼接数字
            r.append(p + (str(c) if c > 1 else ""))
            p = ch
            c = 1
    # 处理最后一组
    r.append(p + (str(c) if c > 1 else ""))
    return "".join(r)

Q2:

题目:一个由 n 个 pod 组成的系统,pod 之间通过若干连接形成多个连通区域(同一连通块视为同一“region”)。每个 pod 初始都有数据库连接;当某个 pod 失去连接后,它所在 region 内如果还有其他“活跃”pod,则数据会转发给该 region 中 ID 最小的活跃 pod;如果该 region 内已没有活跃 pod,则记录错误。需要处理两类查询:① 数据发送查询(判断最终数据写入哪个 pod,或返回 -1);② 数据库连接失效查询(标记某 pod 失效)。最终对每个数据发送查询输出对应结果。本质是:在静态连通分量基础上,动态维护每个连通块中仍然活跃的最小编号节点。

思路:先用并查集把所有 pod 按连接关系分成若干个“区域”,然后对每个区域维护一个最小堆存活 pod 编号,查询时如果当前 pod 还活着就直接返回自己,否则就从对应区域里找还活着的最小编号,没有就返回 -1。

代码:

import heapq as hq

def recoverDeadPods(n, connections, queries):
    # 并查集初始化
    parent = list(range(n + 1))

    def find(x):
        while parent[x] != x:
            parent[x] = parent[parent[x]]  # 路径压缩
            x = parent[x]
        return x

    def union(a, b):
        ra, rb = find(a), find(b)
        if ra != rb:
            parent[rb] = ra

    # 构建连通分量
    for a, b in connections:
        union(a, b)

    # 每个连通块维护一个最小堆(存所有 pod)
    heaps = {}
    active = [True] * (n + 1)

    for i in range(1, n + 1):
        r = find(i)
        if r not in heaps:
            heaps[r] = []
        hq.heappush(heaps[r], i)

    result = []

    # 处理查询
    for t, p in queries:
        if t == 2:
            # pod 失效
            active[p] = False
        else:
            # 数据发送查询
            if active[p]:
                result.append(p)
            else:
                r = find(p)
                h = heaps.get(r, [])

                # 弹出已失效的 pod
                while h and not active[h[0]]:
                    hq.heappop(h)

                if not h:
                    result.append(-1)
                else:
                    result.append(h[0])

    return result

Q3:

题目:给定 n 个节点,每对不同节点之间都可以选择“连接”或“不连接”,问一共可以构造出多少种不同的无向图配置。因为每一对节点是否连边是独立选择的,所以本质是统计所有可能的边组合数量,并对结果取模 109+710^9 + 7。换句话说,需要计算在 n 个节点的无向图中所有可能的不同连边方式总数。

思路:n 个点之间一共有 n(n−1)/2 对可能的边,每条边只有“连或不连”两种状态,所以总方案数就是 2 的这些边数次方,最后用快速幂对 1e9+7 取模。

代码:

def countGraphs(n):
    mod = 10**9 + 7
    # 无向图中可选边的数量
    edges = n * (n - 1) // 2
    # 每条边都有“连”或“不连”两种选择
    return pow(2, edges, mod)

准备小结

如果你也在准备 Bcg X DS 或其他大厂的 OA/VO,可以直接联系 interviewAid 了解对应的面试辅助和陪跑支持。如果你想找我辅助面试,或者用 Bcg X DS 面经中的原题 mock,感受最真实的feedback,欢迎戳我。

全网唯一一家支持 L6 以上 system design mock,只放真实面经。

求职辅助服务,是关于时间和品质的较量。咨询interviewAid,获取最专业的Tech求职辅助。

正文完