文远知行算法笔试0921

题1:数组中找一段异或和等于 k 的子数组

题干
给定整数数组 a[1..n] 与整数 k,求是否存在连续子数组使其异或和为 k。若存在输出该子数组的左右下标(1-based),否则输出 -1

说明
定义前缀异或 px[i] = a1 ⊕ ⋯ ⊕ ai,则区间 [l, r] 的异或和为 px[r] ⊕ px[l−1]

import sys

def main():
    data = list(map(int, sys.stdin.read().strip().split()))
    if not data:
        return
    n, k = data[0], data[1]
    a = data[2:2+n]

    first_pos = {0: 0}  # px[0]=0 at position 0
    px = 0
    for r in range(1, n+1):
        px ^= a[r-1]
        need = px ^ k                   # need px[l-1] == px[r]^k
        if need in first_pos:
            l = first_pos[need] + 1     # 1-based
            print(l, r)
            return
        if px not in first_pos:         # keep earliest
            first_pos[px] = r
    print(-1)

if __name__ == "__main__":
    main()

题2:最长“美观”括号子串(支持 () [] {})

题干
给定仅由括号 ()[]{} 组成的字符串 s,定义:

  • 空串是美观;
  • A 美观,则 (A)[A]{A} 也美观;
  • AB 都美观,则 AB 也美观。

s 中最长美观的连续子串长度。

import sys

pairs = {')':'(', ']':'[', '}':'{'}

def longest_beautiful(s: str) -> int:
    idx_stack = [-1]   # 下标栈,-1 为哨兵
    ch_stack  = ['#']  # 类型栈
    ans = 0
    for i, ch in enumerate(s):
        if ch in "([{":
            idx_stack.append(i)
            ch_stack.append(ch)
        else:
            if len(idx_stack) > 1 and ch_stack[-1] == pairs.get(ch, '?'):
                idx_stack.pop()
                ch_stack.pop()
                ans = max(ans, i - idx_stack[-1])
            else:
                idx_stack.append(i)
                ch_stack.append('#')    # 新的无效基底
    return ans

def main():
    s = sys.stdin.read().strip()
    print(longest_beautiful(s))

if __name__ == "__main__":
    main()

题3:n×m 乘法表的第 k 小元素

题干
乘法表第 i 行第 j 列为 i×j(下标从 1 开始)。给定 n, m, k,将整个乘法表按非降序排列后,求第 k 个元素。

思路
二分答案 x,并统计表中不大于 x 的个数:

找到最小的 x 使得 count(x) ≥ k

import sys

def count_le(n, m, x, k):
    s = 0
    up = min(n, x)
    for i in range(1, up + 1):
        s += min(m, x // i)
        if s >= k:
            return s
    return s

def main():
    n, m, k = map(int, sys.stdin.read().strip().split())
    if n > m:
        n, m = m, n
    lo, hi = 1, n * m
    while lo < hi:
        mid = (lo + hi) // 2
        if count_le(n, m, mid, k) >= k:
            hi = mid
        else:
            lo = mid + 1
    print(lo)

if __name__ == "__main__":
    main()
26秋招算法笔试 文章被收录于专栏

26秋招算法笔试

全部评论
三道题给了多长时间,有没有限制时间
点赞 回复 分享
发布于 2025-09-27 13:50 陕西

相关推荐

评论
1
5
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4453次浏览 78人参与
# 找AI工作可以去哪些公司? #
10086次浏览 314人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15702次浏览 229人参与
# 你的实习产出是真实的还是包装的? #
20825次浏览 346人参与
# 从事AI岗需要掌握哪些技术栈? #
9809次浏览 390人参与
# 春招至今,你的战绩如何? #
67871次浏览 599人参与
# 厦门银行科技岗值不值得投 #
8237次浏览 188人参与
# AI面会问哪些问题? #
29127次浏览 632人参与
# 你做过最难的笔试是哪家公司 #
35940次浏览 313人参与
# 中国电信笔试 #
32390次浏览 301人参与
# 金三银四,你的春招进行到哪个阶段了? #
22563次浏览 284人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
341221次浏览 2176人参与
# 同bg的你秋招战况如何? #
212267次浏览 1121人参与
# 哪些公司真双非友好? #
69817次浏览 289人参与
# 如何准备秋招 #
78324次浏览 868人参与
# 阿里笔试 #
179436次浏览 1324人参与
# 应届生被毁约被毁意向了怎么办 #
63349次浏览 305人参与
# 机械人避雷的岗位/公司 #
62727次浏览 393人参与
# 小马智行求职进展汇总 #
25151次浏览 80人参与
# 第一份工作一定要去大厂吗 #
15204次浏览 123人参与
# 担心入职之后被发现很菜怎么办 #
291429次浏览 1210人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26323次浏览 310人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务