【秋招笔试】2025.08.31网易秋招机考笔试真题改编

✅ 秋招备战指南 ✅

💡 学习建议:

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

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

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

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

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

网易

题目一:魔法师小柯的传送阵实验

1️⃣:模拟执行指令序列,维护位置、朝向和法阵能量点集合

2️⃣:对于瞬移术指令,计算曼哈顿距离找到最近的法阵能量点

3️⃣:根据跳跃规则正确处理指令跳过机制

难度:中等

这道题目的关键在于理解瞬移术的复杂规则,特别是指令跳过机制。需要仔细模拟每一步操作,维护好状态,并正确实现曼哈顿距离的计算和优先级选择。通过暴力枚举法阵能量点,可以在 O(nm) 时间复杂度内解决问题。

题目二:小兰的双重空间闯关

1️⃣:观察到两个角色位置始终相同,简化状态空间为四维

2️⃣:使用BFS算法求解最短路径,同时维护生命值状态

3️⃣:处理陷阱移动规则,确保生命值消耗后仍大于0

难度:中等偏难

这道题目需要理解同步移动的约束条件,将二维坐标问题转化为四维状态空间的BFS问题。关键是正确处理陷阱的移动规则和生命值约束,并在相同步数下选择生命值和最大的方案。状态空间约67万,BFS可以高效求解。

01. 魔法师小柯的传送阵实验

问题描述

小柯是魔法学院的研究生,正在进行传送阵系统的实验。她需要在一个魔法坐标系中操控魔法傀儡,完成指定的法阵收集任务。

在一个无限范围的魔法坐标网格上,分布有 个两两位置不同的"法阵能量点",傀儡的初始位置在 ,初始朝向为南方。记当前位置为 ,则:

  • 向东走一格,位置变为

  • 向南走一格,位置变为

  • 向西走一格,位置变为

  • 向北走一格,位置变为

小柯预设了一条长度为 的魔法指令序列让傀儡执行。指令序列由 三种法术操作组成:

  • :向当前朝向移动一格,若落在法阵能量点位置则收集该能量点

  • :顺时针旋转

  • :触发"瞬移术",按如下步骤执行:

    • 若当前无未收集的法阵能量点,则忽略该指令

    • 在剩余法阵能量点中,选取距离当前位置曼哈顿距离最小的点;若有多点,优先横坐标最小,再优先纵坐标最小

    • 记所选法阵能量点到当前位置的曼哈顿距离为 ,删除前剩余法阵能量点数为

    • 瞬移至该法阵能量点并收集之

    • 跳过随后 条指令;若剩余指令不足,则执行完即停机

输出傀儡执行完所有指令后所在的坐标。

【名词解释】

曼哈顿距离:在平面上,点 的曼哈顿距离定义为

输入格式

每个测试文件均包含多组测试数据。第一行输入一个整数 代表数据组数,每组测试数据描述如下:

第一行输入两个整数 ,表示法阵能量点数、指令长度。

第二行输入一个长度为 、仅由字符 构成的字符串 ,表示指令序列。

此后 行,第 行输入两个整数 ,表示第 个法阵能量点的坐标。

除此之外,保证 个法阵能量点两两位置不同。

输出格式

对于每组测试数据,新起一行,输出两个整数 ,代表傀儡执行完所有指令后所在的坐标。

样例输入

3
2 9
SFFFTFSFF
-2 0
-1 1
2 6
SFFFTF
-2 0
-1 1
2 3
SFF
-2 0
-1 1

样例输出

-2 1
-3 1
-2 0
样例 解释说明
样例1 执行第一个指令 ,选中距离最近的法阵能量点 (距离 ),瞬移并收集,然后跳过接下来的两条指令;执行第四个指令 ,向南移动一格至 ;执行第五个指令 ,面向西;执行第六个指令 ,向西移动一格至
样例2 样例1的子集,最终停在
样例3 样例1的子集,最终停在

数据范围

题解

这道题本质上是一个带有特殊跳跃机制的模拟题。关键在于理解瞬移术的规则和跳跃指令的机制。

首先分析题目的核心操作:

  1. 基本移动:F 指令让傀儡按当前朝向前进一格,T 指令让傀儡顺时针旋转 90 度
  2. 瞬移机制:S 指令触发瞬移,需要找到距离最近的法阵能量点,并跳过后续指令

解题思路如下:

状态维护:需要维护傀儡当前位置 、朝向 和剩余的法阵能量点集合。朝向可以用 0=东、1=南、2=西、3=北 来表示。

指令处理

  • T 指令:直接更新朝向 dir = (dir+1) % 4
  • F 指令:根据朝向更新位置,然后检查是否踩到法阵能量点,如果是则移除
  • S 指令:这是最复杂的部分,需要暴力枚举所有剩余法阵能量点,找到曼哈顿距离最小的那个

瞬移规则详解

  1. 如果没有剩余法阵能量点,直接忽略
  2. 遍历所有剩余法阵能量点,计算曼哈顿距离
  3. 选择距离最小的点,如果有多个则按题目要求选择 x 最小的,再选择 y 最小的
  4. 瞬移到该点并移除该法阵能量点
  5. 跳过后续 条指令,其中 是距离, 是删除前的法阵能量点数量

实现细节

  • 使用向量存储剩余的法阵能量点,便于动态删除
  • 在主循环中处理指令,注意 S 指令可能让指令指针跳跃
  • 坐标可能超出 int 范围,建议使用 long long

时间复杂度分析:最坏情况下每次 S 指令都要遍历所有法阵能量点,总复杂度为 ,完全可以接受。

参考代码

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

# 四个方向:东、南、西、北
dx = [1, 0, -1, 0]
dy = [0, -1, 0, 1]

def solve():
    n, m = map(int, input().split())
    cmd = input().strip()
    
    # 读取法阵能量点坐标
    pts = []
    for _ in range(n):
        x, y = map(int, input().split())
        pts.append([x, y])
    
    x, y = 0, 0  # 初始位置
    dir_idx = 1  # 初始朝向南
    
    i = 0
    while i < m:
        op = cmd[i]
        
        if op == 'T':
            # 顺时针旋转90度
            dir_idx = (dir_idx + 1) % 4
            i += 1
        elif op == 'F':
            # 向当前朝向移动一格
            x += dx[dir_idx]
            y += dy[dir_idx]
            
            # 检查是否踩到法阵能量点
            for j in range(len(pts)):
                if pts[j][0] == x and pts[j][1] == y:
                    pts.pop(j)
                    break
            i += 1
        else:  # op == 'S'
            if not pts:
                i += 1
                continue
            
            # 找到曼哈顿距离最小的法阵能量点
            best_dist = float('inf')
            best_idx = -1
            
            for j in range(len(pts)):
                dist = abs(pts[j][0] - x) + abs(pts[j][1] - y)
                if (dist < best_dist or 
                    (dist == best_dist and pts[j][0] < pts[best_idx][0]) or
                    (dist == best_dist and pts[j][0] == pts[best_idx][0] and pts[j][1] < pts[best_idx][1])):
                    best_dist = dist
                    best_idx = j
            
            # 瞬移到目标点
            x = pts[best_idx][0]
            y = pts[best_idx][1]
            
            # 记录删除前的法阵能量点数量
            m1 = len(pts)
            pts.pop(best_idx)
            
            # 跳过后续指令
            skip = min(best_dist, m1)
            i += 1 + skip
    
    return x, y

T = int(input())
for _ in range(T):
    x, y = solve()
    print(x, y)
  • Cpp
#include <bits/stdc++.h>
using namespace std;

struct Point {
    int x, y;
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int T;
    cin >> T;
    
    // 四个方向:东、南、西、北
    const int dx[4] = {1, 0, -1, 0};
    const int dy[4] = {0, -1, 0, 1};
    
    while (T--) {
        int n, m;
        cin >> n >> m;
        
        string ops;
        cin >> ops;
        
        vector<Point> pts(n);
        for (int i = 0; i < n; i++) {
            cin >> pts[i].x >> pts[i].y;
        }
        
        long long x = 0, y = 0;  // 当前位置
        int dir = 1;  // 初始朝向南
        
        for (int i = 0; i < m; ) {
            char op = ops[i];
            
            if (op == 'T') {
                // 顺时针旋转90度
                dir = (dir + 1) & 3;
                i++;
            } else if (op == 'F') {
                // 向当前朝向移动一格
                x += dx[dir];
                y += dy[dir];
                
                // 检查是否踩到法阵能量点
                for (size_t j = 0; j < pts.size(); j++) {
                    if (pts[j].x == x && pts[j].y == y) {
                        pts.erase(pts.begin() + j);
                        break;
                    }
                }
                i++;
            } else {  // op == 'S'
                if (pts.empty()) {
                    i++;
                    continue;
                }
                
                // 找到曼哈顿距离最小的法阵能量点
                int best_idx = 0;
                long long best_dist = LLONG_MAX;
                
                for (size_t j = 0; j < pts.size(); j++) {
                    long long dist = abs((long long)pts[j].x - x) + abs((long long)pts[j].y - y);
                    if (dist < best_dist || 
                        (dist == best_dist && pts[j].x < pts[best_idx].x) ||
                        (dist == best_dist && pts[j].x == pts[best_idx].x && pts[j].y < pts[best_idx].y)) {
                        best_dist = dist;
                        best_idx = j;
                    }
                }
                
                // 瞬移到目标点
                x = pts[best_idx].x;
                y = pts[best_idx].y;
                
                // 记录删除前的法阵能量点数量
                long long m1 = pts.size();
                pts.erase(pts.begin() + best_idx);
                
                // 跳过后续指令
                long long skip = min(best_dist, m1);
                i += 1 + skip;
            }
        }
        
        cout << x << " " << y << "\n";
    }
    
    return 0;
}
  • Java
import java.io.*;
import java.util.*;

public class Main {
    static class Point {
        int x, y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int T = Integer.parseInt(br.readLine());
        
        // 四个方向:东、南、西、北
        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, -1, 0, 1};
        
        while (T-- > 0) {
            String[] firstLine = br.readLine().split(" ");
            int n = Integer.parseInt(firstLine[0]);
            int m = Integer.parseInt(firstLine[1]);
            
            String ops = br.readLine();
            
            List<Point> pts = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                String[] coords = br.readLine().split(" ");
                int x = Integer.parseInt(coords[0]);
                int y = Integer.parseInt(coords[1]);
                pts.add(new Point(x, y));
            }
            
            long x = 0, y = 0;  // 当前位置
            int dirIdx = 1;  // 初始朝向南
            
            for (int i = 0; i < m; ) {
                char op = ops.charAt(i);
                
                if (op == 'T') {
                    // 顺时针旋转90度
                    dirIdx = (dirIdx + 1) % 4;
                    i++;
                } else if (op == 'F') {
                    // 向当前朝向移动一格
                    x += dx[dirIdx];
                    y += dy[dirIdx];
                    
                    // 检查是否踩到法阵能量点
                    for (int j = 0; j < pts.size(); j++) {
                        if (pts.get(j).x == x && 

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

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

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

全部评论

相关推荐

昨天 09:27
已编辑
腾讯_后台开发(准入职员工)
牛客的腾讯准入职员工的新认证已经到位了,也是时候总结一下了。最后的最后,经历了数不清的面试排序,楼主还是第二次选择了腾讯。回想楼主的面试历史,从去年的3月一路面试到今年的八月,从暑期实习再到去年的秋招提前批,秋招正式批,春招,春招补录,再到26届的秋招。记忆已经模糊到记不清有过多少场面试,见过多少面试官的脸。去年秋招签约腾讯后,以为一切都终结了。但是最终因为延毕,在等待四个月之后,今年六月又与腾讯解约,是的,在绝大多数研究生准备拿证入职的时间,我没有拿到证也没有入得了职。或许那边的hr也已经真的尽力了吧,3月份提了延毕的事情,一直到6月份说争取之后无法通过,最后也给免了违约金。这期间我永远抱着最美好的幻想,刷脉脉,刷小红书,刷牛客,搜索最多的关键词是延迟三个月能否保留offer。其实从一开始没有给出明确回复,从一开始抽出逆位的高塔和逆位的命运之轮,我就应该做好了准备才对的,理想啊与现实重视有着不小的差距。从3月份开始又接着面字节和一些小公司,字节一边面暑期实习,一边又给我转春招,最后在上一年拒绝掉的抖音电商部门hr面后排序挂,得到的回复是最终那边也没有提交面评。在和腾讯解约三方之后又被腾讯新的部门捞,腾讯广告三面主管面之后再次挂掉,teg提前批GM&nbsp;hr面结束后挂掉。期间又参加了阿里虾皮美团等等的面试,有社招,有补录,有秋招,大部分也是一二面之后挂。对比去年的秋招,每投一个公司,只要有一面一定会拿offer,似乎运气已经不站在我这边了。3月到7月的这段时间,每次接到新面试的时候,总会惊喜和慌张,每次主管面之后总会觉得,这一次该结束了吧,字节hr面的那个下午大家都去拍毕业照,舍友问我什么时候入职,我说如果这次过了应该和你们一起吧,只不过我是实习……&nbsp;&nbsp;teg的GM&nbsp;hr线下面试,从金地威新大厦出来的那一瞬间,查到了自己论文盲审通过的消息,那时候以为真的一切都结束了,晚上我一个人在湾区之光摩天轮前许愿,许愿面试通过许愿一切顺利,然而最后&nbsp;,霓虹灯消去,太阳升起,招聘页面还是换成了灰白色的流程已结束。记得那个早上空调坏了,一直在滴水,宿舍很热,我坐起来看到流程已结束的页面,感觉浑身都很麻木,身体里面很冷,身体外面却很热,我又打开了微信公众号的小林coding,就打开了手机leetcode,看了那段时间看的最多的题目:数组中的第k个最大元素,恍惚间想到其实招聘找工作也像这道题里的那个堆一样,一开始就只有k,不过还是想要挤进去,直到最后一个元素为止。这个时间段捞我的面试官和hr说的最多的就是,很可惜,但是以后的路还很长,是啊,人生的路是很长的,这才到哪里最后的最后,还是被腾讯捞了一次,很幸运再次走到了hr面,hr问我你去年拿过多少offer,我开始报菜名,他说很不容易啊,去年拿过那么多,我说即使再多最终也只能选一个。他又问我迄今为止参加过多少场hr面试了,我说实在记不清了,10次,20次。那个瞬间我甚至在想或许是不是拒绝错了,去年那么多次的选择,今年在被腾讯广告拒绝之后,也曾拿过一个不错的二线城市的中厂offer,那个hr几乎给我争取到了他们公司当年应届的最高薪资。最后,在毕业答辩之前的一天,我再次拿到了腾讯的offer,没有很多预兆的一个电话,曾睡觉前幻想过无数次的声音,这一次是真的结束了。有时候会想,我究竟选择了什么样的一条路,一个学材料的非科班,与导师,与同门,与舍友,与所有人背道而驰。别人的三年,是实验室的苦闷,sci接受的快感,是朝九晚十按部就班的生活。我的三年,是日日夜夜暗黑色的IDE闪着五颜六色的代码,是一换导师,两度秋招,五搬宿舍的奔波。在广东这片离我家乡1800多公里的闷热的土地上,无数次的夜晚,我问自己为什么要坚持。依稀记得最开始打开动力节点的网课,杜老师在视频里操着没那么标准的普通话说,大家好,从现在开始,你们有了一个新的身份,java软件工程师了。那时的我真的觉得这件事情很魔幻。起初我就是单纯想着工资高一点,有了更多钱可以做更多事,不敢确定是哪一个瞬间把我彻底从材料研究生变成软件开发菜鸟了。或许是通宵完成的第一个阿里终端训练营项目,拿到沉甸甸奖杯的时候,或许是第一次拿到腾讯实习,进入滨海大厦的那个早晨,或许是第一次字节三面,我在腾讯的文印室把自己面哭了(因为我知道我一定已经拿下那个offer,事实也雀食如此),也或许更早一点,是在第一次意识到原来做一份自己没有那么讨厌,又有一些兴趣的事情原来真的很开心。如今一切尘埃落定,曾经以为失去的,学位,职位,现在一一都要拿回来。大刘的《超新星纪元》中有句话说:人们常说,有志者事竟成,今天,我要告诉你们,这句话是错误的,只有符合科学客观规律的事情,才能成。我们人生中遇到的百分之九十九的事情都是成不了的,而我们的工作就是找到那百分之一的事情。我想我找到了我人生中的这件事,也希望大家都能先去找到这件事,在这之后,努力也好,内卷也好,躺平也好,摆烂也好,至少我们都是在自己人生中正确的路上前进。希望26秋招,大家都能得偿所愿,我这样的叠满buff的都成了,大家也能成!最后的致谢我感谢了很多人,但是其实我最想写还是这句话:最后,&nbsp;我要感谢那个永不言弃的自己,我始终坚信即使是西西弗斯,也能在日复一日的推石中找到属于自己的意义。
明天不下雨了:在广东这片离我家乡1800多公里的闷热的土地上我是非常同意的
投递阿里巴巴集团等公司10个岗位
点赞 评论 收藏
分享
内存泄漏指的是在程序中存在一些不再需要的对象,但由于某些原因无法被垃圾回收器正确回收和释放,导致这些对象占据着内存空间,无法被再次利用。内存泄漏会导致内存占用不断增加,最终可能导致程序的性能问题和崩溃。在前端开发中,内存泄漏通常是由以下情况引起的:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=d59bf6cbe74a47848bb179590bdf5f59无限制的事件监听器:当在DOM元素上注册事件监听器,但未正确删除或解绑它们时,事件监听器将一直存在并占用内存。特别是在持续性的页面或组件使用中,如果没有适当地取消注册事件监听器,就会导致内存泄漏。解决方法:在销毁页面或组件之前,务必取消注册所有的事件监听器,或使用一些库或框架提供的自动解绑机制。定时器未清除:在使用setTimeout()或setInterval()设置定时器时,如果没有及时清除已经执行或不再需要的定时器,它们会继续占用内存。解决方法:在定时器不再需要时,使用clearTimeout()或clearInterval()清除定时器。循环引用:当两个或多个对象之间存在相互引用,并且这些对象都不再被访问时,它们无法被垃圾回收器正确识别和回收,从而导致内存泄漏。解决方法:确保相互引用的对象在不再使用时可以被垃圾回收器正确回收。这可以通过破坏循环引用、使用弱引用、手动解除引用等方式来实现。大量缓存数据:如果在前端应用中保存大量的缓存数据,而这些数据在实际上不再需要,就会导致内存泄漏。解决方法:合理管理缓存数据,定期清理不再需要的缓存,避免无效的内存占用。总体来说,避免内存泄漏的关键是及时清理不再使用的资源,包括事件监听器、定时器、缓存数据等。在编码过程中,需要特别留意对这些资源的管理,在确保它们不再需要时进行正确释放,以便垃圾回收器能够将其回收并释放相应的内存空间。同时,使用工具和性能分析器可以帮助检测和定位内存泄漏问题,以及进行性能优化。
前端学习交流
点赞 评论 收藏
分享
挽弦慕笙:现在27届实习岗位已经比前几个月多不少了 前几个月才叫真地狱,多投吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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