【笔试刷题】米哈游-2026.03.14-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

米哈游-2026.03.14

米哈游

这一套题前两题都不难读懂,但切入口要找对。第一题是标准统计题,第二题看上去像删数构造,实质上就是最长摆动子序列;真正拉开差距的是第三题,需要把树上路径异或和改写成前缀异或的点对贡献。

题目一:展墙与橱窗配对

题面包装成展馆布置,本质却很朴素:行和与列和能否配对,只和总和数值有关,和格子内部怎么分布无关。先把每一行、每一列的总数算出来,再用哈希表统计频次,答案就是同值频次的配对和。

题目二:错峰站位

这题最容易在“删哪些人” 上绕进去,其实换个说法就通了:保留下来的序列必须让相邻差值符号交替。于是问题直接落成最长摆动子序列,贪心保留转折点即可,最后用总人数减去最长长度。

题目三:秘境回路异纹和

树上路径异或和如果硬枚举点对肯定不行,关键是先把每个点的“根到点前缀异或” 算出来。路径异或会变成两个前缀异或的异或,再按位拆贡献,统计每一位上 的总和,就能在线性级别内做完。

1. 展墙与橱窗配对

问题描述

K 小姐正在整理一张展馆布置表。表格一共有 列,第 行第 列的数字 表示第 条展墙在第 个橱窗区域对应的陈列数量。

现在要做一组“展墙 - 橱窗” 联动推荐。若某条展墙这一整行的陈列总数,恰好等于某个橱窗区域这一整列的陈列总数,那么这一对就能组成一组合法配对。

请统计一共有多少个这样的有序二元组

输入格式

第一行输入两个整数 ,表示展馆布置表的行数和列数。

接下来输入 行,每行包含 个整数,其中第 行第 个数表示

输出格式

输出一个整数,表示合法配对数量。

样例输入

3 3
1 1 1
1 1 1
1 1 1

样例输出

9

数据范围

样例 解释说明
样例1 三条展墙的总数都是 ,三个橱窗区域的总数也都是 ,所以任意一条展墙都能和任意一个橱窗区域配对,共有 对。

题解

题目真正关心的不是某个格子的数值,而是整行总数和整列总数能不能对上。

设某个值 作为“行和” 出现了 次,作为“列和” 出现了 次。那么凡是行和等于 的展墙,都能和列和等于 的橱窗区域一一配对,所以这一类一共贡献 个答案。

于是做法很自然:

  1. 读入表格时,同时算出每一行的总和和每一列的总和。

  2. 用哈希表统计每种行和出现了多少次。

  3. 再扫一遍所有列和,把对应的行和频次累加到答案里。

这样每个合法配对只会按它共同的总和被统计一次,不会漏,也不会重。

复杂度分析

读入和求和是 ,统计答案是 ,总时间复杂度是 。额外空间复杂度是

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

def solve():
    n, m = map(int, input().split())
    # rs 记录每条展墙的总数,cs 记录每个橱窗区域的总数。
    rs = [0] * n
    cs = [0] * m

    for i in range(n):
        row = list(map(int, input().split()))
        rs[i] = sum(row)
        for j, x in enumerate(row):
            cs[j] += x

    # 统计每种行和出现了多少次。
    mp = {}
    for x in rs:
        mp[x] = mp.get(x, 0) + 1

    # 每个列和都去匹配相同的行和频次。
    ans = 0
    for x in cs:
        ans += mp.get(x, 0)

    print(ans)

if __name__ == "__main__":
    solve()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    // rs 统计每一行总和,cs 统计每一列总和。
    vector<long long> rs(n, 0), cs(m, 0);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            long long x;
            cin >> x;
            rs[i] += x;
            cs[j] += x;
        }
    }

    unordered_map<long long, long long> mp;
    mp.reserve(n * 2 + 1);
    for (long long x : rs) {
        ++mp[x];
    }

    // 对每个列和累加相同行和的出现次数。
    long long ans = 0;
    for (long long x : cs) {
        auto it = mp.find(x);
        if (it != mp.end()) {
            ans += it->second;
        }
    }

    cout << ans << '\n';
    return 0;
}
  • Java
import java.io.*;
import java.util.*;

public class Main {
    static class FastScanner {
        private final InputStream in = System.in;
        private final byte[] buf = new byte[1 << 16];
        private int ptr = 0;
        private int len = 0;

        private int read() throws IOException {
            if (ptr >= len) {
                len = in.read(buf);
                ptr = 0;
                if (len <= 0) {
                    return -1;
                }
            }
            return buf[ptr++];
        }

        long nextLong() throws IOException {
            int c;
            do {
                c = read();
            } while (c <= 32 && c != -1);

            long sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }

            long val = 0;
            while (c > 32) {
                val = val * 10 + c - '0';
                c = read();
            }
            return val * sgn;
        }
    }

    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner();
        int n = (int) fs.nextLong();
        int m = (int) fs.nextLong();

        // rs 和 cs 分别维护行和与列和。
        long[] rs = new long[n];
        long[] cs = new long[m];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                long x = fs.nextLong();
                rs[i] += x;
                cs[j] += x;
            }
        }

        Map<Long, Integer> mp = new HashMap<>();
        for (long x : rs) {
            mp.put(x, mp.getOrDefault(x, 0) + 1);
        }

        // 枚举列和并查找对应的行和频次。
        long ans = 0;
        for (long x : cs) {
            ans += mp.getOrDefault(x, 0);
        }

        System.out.println(ans);
    }
}

2. 错峰站位

问题描述

K 小姐正在给一组演员安排舞台站位。第 位演员的站位高度记为

如果一段站位序列满足下面两个条件,就称它是“错峰站位”:

  • 对于每个中间位置,当前演员的高度要么严格高于左右两侧,要么严格低于左右两侧。

  • 任意相邻两位演员的高度都不能相等。

现在可以从原序列中删除若干位演员,剩下的演员保持原有相对顺序不变。请计算最少要删除多少人,才能让剩余队形变成“错峰站位”。

输入格式

第一行输入一个整数 ,表示演员人数。

第二行输入 个整数 ,表示每位演员的站位高度。

输出格式

输出一个整数,表示最少删除人数。

样例输入

7
1 3 1 4 5 2 0
3
2 2 2

样例输出

2
2

数据范围

样例 解释说明
样例1 删除 这两位高度后,可以保留序列 ,此时相邻高低关系交替出现,满足要求。
样例2 所有人高度都相同,不可能留下长度至少为 的合法相邻关系,最优只能留下 1 人,所以要删掉 2 人。

题解

把题意翻成更熟悉的话,剩下的序列要满足“相邻差值的正负号严格交替”,并且不能出现相邻相等。这正是经典的最长摆动子序列。

所以原问题可以改写成:

  • 尽量保留更多演员,使保留下来的高度序列成为摆动序列。

  • 设这个最长长度是 ,那么最少删除人数就是

为什么可以贪心

从左到右看相邻差值:

  • 若当前差值为正,说明这一段趋势在上升。

  • 若当前差值为负,说明这一段趋势在下降。

  • 若当前差值为 ,这个位置对制造起伏没有帮助,可以直接忽略。

真正有价值的是“趋势改变”的那一刻。只要发现当前差值和上一段有效差值符号不同,就说明出现了一个新的波峰或波谷,可以把答案加一。

这件事之所以能贪心,是因为在一段连续上升里,保留更靠后的更高位置只会更有利;在一段连续下降里,保留更靠后的更低位置也只会更有利。也就是说,同方向的一长段走势,中间点没有必要全部留下,只保留转折点就够了。

做法

  1. 先把答案设成 ,表示至少可以保留一个人。

  2. 维护上一段有效差值 pre

  3. 依次考察相邻两人的差值 cur

    • cur=0,跳过。

    • curpre 异号,说明出现新转折,保留人数加一,并更新 pre

  4. 最终输出

复杂度分析

只需要一趟扫描,时间复杂度是 ,额外空间复杂度是

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

def solve():
    n = int(input())
    a = list(map(int, input().split()))

    # 至少可以保留 1 人。
    ans = 1
    # pre 记录上一段有效差值的符号。
    pre = 0

    for i in range(1, n):
        cur = a[i] - a[i - 1]
        if cur == 0:
            continue
        # 遇到新的转折点,就把它计入摆动序列。
        if (cur > 0 and pre <= 0) or (cur < 0 and pre >= 0):
            ans += 1
            pre = cur

    print(n - ans)

if __name__ == "__main__":
    solve()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullpt

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

工作职责&nbsp;1、参与大型商业游戏的客户端开发,深入理解玩法设计,将策划案转化为稳定、可扩展的代码实现;2、使用游戏引擎开发核心模块,如:AI、角色3C(移动/镜头/控制)、战斗逻辑、UI系统、场景管理、性能优化等;3、与策划、美术紧密协作,参与技术方案设计,为游戏体验提升提供专业建议;4、攻克网络同步、内存优化、渲染效率等技术难点,保障玩家流畅体验。任职要求1、计算机相关专业,具备扎实的计算机基础(数据结构/算法/操作系统/网络);2、热爱编程,至少掌握一种游戏开发常用的编程语言,并深入了解其思想、原理和底层细节;3、具备系统性的编程思维,能对复杂问题进行拆解并设计清晰解决方案;4、逻辑思考、沟通表达清晰,具备团队协作意识,对技术难题有强烈的好奇心和攻克欲望;5、具备快速学习能力,能主动跟进游戏开发领域的新技术趋势;6、实习时长不低于3个月,每周出勤至少4天。加分项1、有实际游戏项目的开发经历或实习经历;2、接触学习过游戏开发引擎(比如Unity、虚幻);3、有&nbsp;AIGC、代码大模型提效、AI&nbsp;自动化、AI&nbsp;Agent&nbsp;等相关AI应用经验者优先面向对象2027届及之后毕业的在校生投递链接https://jobs.mihoyo.com/?sharePageId=121176&amp;recommendationCode=052BT&amp;isRecommendation=true#/campus/position/7756
点赞 评论 收藏
分享
03-24 12:36
门头沟学院 Java
秋招跑了大半年,前前后后做了几十家公司的笔试,从互联网大厂到量化私募,从国企总行到游戏公司,真的见识了什么叫&nbsp;“没有最难,只有更难”。1.&nbsp;头部量化私募(九坤、幻方、灵均、宽德)难度天花板,没有之一,能完整做完的都是真大神。难在哪里:题型极其硬核,完全不是互联网笔试的量级。除了超难的算法题(普遍是&nbsp;LeetCode&nbsp;Hard&nbsp;+&nbsp;难度,还会涉及竞赛题),还有大量的概率论、线性代数、随机过程、高数证明题,甚至还有&nbsp;C++&nbsp;底层原理、Linux&nbsp;内核相关的硬核选择题,对数学和编程功底的要求拉到极致。真实体感:我做九坤的笔试,120&nbsp;分钟,10&nbsp;道选择&nbsp;+&nbsp;3&nbsp;道编程&nbsp;+&nbsp;2&nbsp;道证明题,选择题一半靠蒙,编程题一道没完整&nbsp;AC,证明题直接空着,考完直接怀疑人生,非科班&nbsp;+&nbsp;数学功底弱的,直接会被劝退。2.&nbsp;华为「天才少年计划」/&nbsp;高端岗位笔试普通&nbsp;OD&nbsp;岗的笔试难度就不低,天才少年&nbsp;/&nbsp;高端研发岗的笔试,更是地狱级。难在哪里:题量超大,难度拉满,对代码的时间、空间复杂度要求极其严格。通常是&nbsp;5&nbsp;道算法题,150&nbsp;分钟,几乎全是&nbsp;Hard&nbsp;难度,涉及动态规划、图论、复杂模拟、数据结构设计,很多题都有隐藏坑,暴力解法直接超时,必须想到最优解才能&nbsp;AC。真实体感:身边的&nbsp;985&nbsp;硕学长,刷了&nbsp;600&nbsp;多道&nbsp;LeetCode,做华为高端岗的笔试,也只&nbsp;AC&nbsp;了&nbsp;2&nbsp;道半,对边界情况的处理、代码优化能力的要求,远比普通大厂高得多。3.&nbsp;腾讯游戏&nbsp;/&nbsp;米哈游&nbsp;游戏客户端&nbsp;/&nbsp;引擎开发岗笔试游戏圈的笔试,是出了名的难,完全是另一个维度的考核。难在哪里:不只是考算法,更是考游戏开发的硬核功底。题型覆盖&nbsp;C++&nbsp;底层原理、计算机图形学、OpenGL/DirectX、物理引擎、数据结构、操作系统,还有超难的算法编程题,很多题都是针对游戏开发场景设计的,没接触过的话,连题干都读不懂。真实体感:做米哈游的客户端开发笔试,选择题一半都是图形学和&nbsp;C++&nbsp;内存管理的硬核题,编程题考了游戏里的碰撞检测算法,完全没接触过的话,根本无从下手,非游戏开发方向的,大概率会直接交白卷。4.&nbsp;字节跳动&nbsp;算法岗&nbsp;/&nbsp;后端开发岗笔试互联网大厂里,字节的笔试难度是公认的第一梯队,虐哭了无数校招生。难在哪里:题量超大,时间极紧,难度梯度离谱。通常是&nbsp;40&nbsp;道行测&nbsp;+&nbsp;4&nbsp;道算法题,120&nbsp;分钟完成。行测题烧脑耗时间,算法题&nbsp;2&nbsp;道中等&nbsp;+&nbsp;2&nbsp;道&nbsp;Hard,几乎没有送分题,对做题速度和心态都是极致的考验,很多人行测就耗掉了一大半时间,算法题根本没时间写。真实体感:秋招做字节的后端笔试,行测就做了&nbsp;50&nbsp;分钟,剩下的时间&nbsp;4&nbsp;道算法题,只&nbsp;AC&nbsp;了&nbsp;1&nbsp;道半,身边很多同学都是全程被按在地上摩擦,能&nbsp;AC3&nbsp;道以上的,都能被称为大神。5.&nbsp;六大行总行&nbsp;/&nbsp;政策性银行&nbsp;科技岗笔试非技术岗里的地狱难度,难在离谱的题量和无所不包的考点。难在哪里:和互联网公司完全不同,不只是考编程,考点覆盖行测、英语、计算机专业知识(计算机网络、操作系统、数据库、组成原理、C++/Java)、金融知识、时政、常识,甚至还有性格测试,题量能到&nbsp;200&nbsp;多道,考试时间&nbsp;3&nbsp;个小时,全程手不停,做到最后眼睛都花了。真实体感:做某国有大行总行的科技岗笔试,3&nbsp;个小时,200&nbsp;多道题,英语还有&nbsp;10&nbsp;道完形填空&nbsp;+&nbsp;5&nbsp;篇阅读理解,计算机专业知识考得又偏又细,做到最后手都酸了,连蒙带猜才勉强做完,考完直接脑子一片空白。最后想跟牛友们说,笔试只是秋招的一关,哪怕考崩了也不用自我否定,很多笔试的通过率本来就极低,不是你不够优秀。
你做过最难的笔试是哪家公...
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务