网易笔试 网易笔试题 0817

笔试时间:2024年08月17日 比较难,只有前两题有解;

历史笔试传送门:2023秋招笔试合集

第一题

题目:服务器压力之横屿荡寇

横屿荡寇是倩女幽魂手游在23年上线的全新帮会团本。活动开放时间是周日全天,每个帮会有一次开启横屿荡寇副本的机会。为了召集更多帮会成员参与副本,每个帮会往往会在一个约定好的时间点开启副本,以保证帮会成员的参与率。对于不同水平的帮会,通关副本的时间会有所不同。

团本开启期间,服务器负载会随着参与战斗的人数上升而增高。因而负责该玩法的服务器程序小倩想根据历史统计数据,估算周日当天,每组服务器中,最多有多少玩家同时在横屿荡寇副本中战斗。

p.s.一组服务器中的帮会开启副本时,共同使用一份服务器资源,不同组服务器之间互不影响。

输入描述

一行一个数字 M,代表有 M 组不同的服务器需要估算,1<=M<=5。

接着M组数据,每组数据分别为:

一行一个数字 N,代表该服务器有N个帮会,5 <= N <= 20。

N行数据,每一行数据表示该帮会信息,格式如下:

hh:mm k t

分别表示:

hh:mm开启副本的时间,例如09:20、16:04,输入保证时间格式正确。

k参与副本的人数,为正整数,范围 10 <= k <= 100

t副本持续时长,单位为分钟,范围 30 <= t <= 120。

p.s.副本开启时即开始计算持续时长,例如 15:40 开启,持续60分钟,意味着 15:40 到16:39 期间,该帮会在副本内战斗。16:40时,该帮会已经离开副本,不再计入统计。

p.p.s.数据保证副本一定在今日完成。

输出描述

对于每组服务器,输出当日该服务器最多有多少人同时参与横屿荡寇副本。

样例输入

3

5

16:00 30 90

17:00 15 120

16:20 28 80

10:05 30 120

09:02 50 70

5

16:00 30 90

17:29 15 120

16:20 28 80

10:05 20 120

09:02 10 70

5

16:00 30 90

17:30 15 120

16:20 28 80

10:05 20 120

09:02 10 70

样例输出

80

73

58

说明

第一组服务器,10:05-10:11期间有80人同时在进行横屿荡寇副本,人数最多。

第二组服务器,17:29时有73人同时在进行横屿荡寇副本,人数最多。

第三组服务器,16:20-17:29期间有58人,17:30-17:39期间有43人,故输出58。

参考题解

我们可以将每个帮会的副本开启时间和结束时间视作一个事件。具体来说,每个帮会的副本开启时,其参与人数会对并发人数产生正影响(人数增加),而副本结束时,其参与人数会对并发人数产生负影响(人数减少)。因此,可以将副本的开始和结束时间分别视为两个时间点事件,在这些事件上分别加上或减去该帮会的参与人数。差分法的关键是通过记录这些时间点的变化来累加计算出在每个时刻的最大并发人数。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

// 转换为以分钟为单位
int parse(const string& time_str) {
    int hh = stoi(time_str.substr(0, 2));
    int mm = stoi(time_str.substr(3, 2));
    return hh * 60 + mm;
}


int solve(const vector<tuple<string, int, int>>& server_data) {
    map<int, int> time_changes;

    for (const auto& [start_time, players, duration] : server_data) {
        int start_minutes = parse(start_time);
        int end_minutes = start_minutes + duration;


        time_changes[start_minutes] += players;


        time_changes[end_minutes] -= players;
    }

    int max_players = 0;
    int current_players = 0;
    for (const auto& [time_point, change] : time_changes) {
        current_players += change;
        max_players = max(max_players, current_players);
    }

    return max_players;
}

int main() {
    int M; 
    cin >> M;

    while (M--) {
        int N; 
        cin >> N;

        vector<tuple<string, int, int>> server_data;

        for (int i = 0; i < N; ++i) {
            string hhmm;
            int k, t;
            cin >> hhmm >> k >> t;
            server_data.emplace_back(hhmm, k, t);
        }

        cout << solve(server_data) << endl;
    }

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

public class Main {

    // 转换为以分钟为单位
    public static int parse(String timeStr) {
        int hh = Integer.parseInt(timeStr.substring(0, 2));
        int mm = Integer.parseInt(timeStr.substring(3, 5));
        return hh * 60 + mm;
    }

    public static int solve(List<ServerData> serverDataList) {
        TreeMap<Integer, Integer> timeChanges = new TreeMap<>();

        for (ServerData data : serverDataList) {
            int startMinutes = parse(data.startTime);
            int endMinutes = startMinutes + data.duration;

            timeChanges.put(startMinutes, timeChanges.getOrDefault(startMinutes, 0) + data.players);
            timeChanges.put(endMinutes, timeChanges.getOrDefault(endMinutes, 0) - data.players);
        }

        int maxPlayers = 0;
        int currentPlayers = 0;

        for (int change : timeChanges.values()) {
            currentPlayers += change;
            maxPlayers = Math.max(maxPlayers, currentPlayers);
        }

        return maxPlayers;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int M = scanner.nextInt();

        while (M-- > 0) {
            int N = scanner.nextInt();
            List<ServerData> serverDataList = new ArrayList<>();

            for (int i = 0; i < N; ++i) {
                String hhmm = scanner.next();
                int k = scanner.nextInt();
                int t = scanner.nextInt();
                serverDataList.add(new ServerData(hhmm, k, t));
            }

            System.out.println(solve(serverDataList));
        }

        scanner.close();
    }
}

class ServerData {
    String startTime;
    int players;
    int duration;

    public ServerData(String startTime, int players, int duration) {
        this.startTime = startTime;
        this.players = players;
        this.duration = duration;
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def parse(time_str):
    hh, mm = map(int, time_str.split(':'))
    return hh * 60 + mm

def solve(server_data):
    time_changes = {}

    for start_time, players, duration in server_data:
        start_minutes = parse(start_time)
        end_minutes = start_minutes + duration


        if start_minutes in time_changes:
            time_changes[start_minutes] += players
        else:
            time_changes[start_minutes] = players


        if end_minutes in time_changes:
            time_changes[end_minutes] -= players
        else:
            time_changes[end_minutes] = -players


    max_players = 0
    current_players = 0
    for time_point in sorted(time_changes):
        current_players += time_changes[time_point]
        max_players = max(max_players, current_players)

    return max_players


M = int(input()) 

for _ in range(M):
    N = int(input()) 
    server_data = []

    for _ in range(N):
        hhmm, k, t = input().split()
        k = int(k)
        t = int(t)
        server_data.append((hhmm, k, t))


    print(solve(server_data))

第二题

题目:师门整顿

在逆水寒手游师徒系统里,一个师傅最多能有五个徒弟,一个徒弟只能有一个师傅(测试用例会保证这个数据的正确性)。 每个玩家只能与一位其他玩家绑定情缘关系。参考近亲不可结婚的原则(非完全一样),游戏对于情缘关系也有限制,师门规则是:同一师门中关系中,相隔小于三代之内不可建立情缘关系。现在给出两组包含师徒关系以及情缘关系数据的玩家id数组,需要你找出其中违反师门规则的所有玩家id。

输入描述

第一行输入正整

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

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

2024-12-03 14:36
已编辑
吉首大学 Java
一面1.&nbsp;自我介绍2.&nbsp;网络&nbsp;&nbsp;&nbsp;1.&nbsp;TCP三次握手、四次挥手&nbsp;&nbsp;&nbsp;2.&nbsp;TCP和UDP区别&nbsp;&nbsp;&nbsp;3.&nbsp;如何实现一个可靠的UDP(我直接回答了QUIC,以及哪些实现哪些策略让他稳定可靠)(文章推荐:https://juejin.cn/post/7428200842229006377#heading-0;视频推荐:https://www.bilibili.com/video/BV1fr4y1F7BD?spm_id_from=333.788.videopod.sections&amp;vd_source=ea52eeafecc0fa82395b5b7600d5b266)&nbsp;&nbsp;&nbsp;4.&nbsp;Https解决了Http什么问题(下面是个大概,都需要展开说说)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;信息加密:混合加密实现信息机密性,解决窃听风险&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;验证机制:摘要算法实现完整性,为数据生成独一无二的【指纹】,用于检验数据完整性,解决篡改风险&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;身份证书:将服务器的公钥放入数字证书,解决冒充风险&nbsp;&nbsp;&nbsp;5.&nbsp;TSL四次握手&nbsp;&nbsp;&nbsp;6.&nbsp;CA证书验证流程,存储在哪里?3.&nbsp;操作系统&nbsp;&nbsp;&nbsp;1.&nbsp;线程和进程区别&nbsp;&nbsp;&nbsp;2.&nbsp;进程通信方式4.&nbsp;数据结构&nbsp;&nbsp;&nbsp;1.&nbsp;堆(数组实现,是一个完全二叉树结构)&nbsp;&nbsp;&nbsp;2.&nbsp;排序算法的时间复杂度对比&nbsp;&nbsp;&nbsp;3.&nbsp;排序算法哪些是稳定的,哪些是不稳定的5.&nbsp;算法&nbsp;&nbsp;&nbsp;1.&nbsp;堆排序(pass)&nbsp;&nbsp;&nbsp;2.&nbsp;螺旋数组&nbsp;&nbsp;&nbsp;3.&nbsp;手撕HashMap6.&nbsp;讲解HashMap扩容7.&nbsp;rehash和二次hash有什么区别(自己口误,给挖坑了)二面1.&nbsp;自我介绍(面试官是老乡,寒暄了几句)2.&nbsp;算法&nbsp;&nbsp;&nbsp;1.&nbsp;大数乘法(这个真忘了,一般碰到这种都是工具类写了,撕了20分钟,没写出来)&nbsp;&nbsp;&nbsp;2.&nbsp;leetcode上的一个中等dp(背包问题),具体是哪个找不到了。3.&nbsp;实习拷打4.&nbsp;项目拷打二面一直拷打,回答一句,问一个,问到不会为止(已挂)大数加法:public&nbsp;String&nbsp;solve(String&nbsp;s,&nbsp;String&nbsp;t)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s&nbsp;==&nbsp;null&nbsp;||&nbsp;t&nbsp;==&nbsp;null&nbsp;||&nbsp;s.length()&nbsp;==&nbsp;0&nbsp;||&nbsp;t.length()&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals(&amp;quot;0&amp;quot;)&nbsp;||&nbsp;t.equals(&amp;quot;0&amp;quot;))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&amp;quot;0&amp;quot;;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;nums&nbsp;=&nbsp;new&nbsp;int[s.length()&nbsp;+&nbsp;t.length()];&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;计算乘积并累加到相应位置 for (int i = s.length() - 1; i >=&nbsp;0;&nbsp;i--)&nbsp;{ for (int j = t.length() - 1; j >=&nbsp;0;&nbsp;j--)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nums[i&nbsp;+&nbsp;j&nbsp;+&nbsp;1]&nbsp;+=&nbsp;(s.charAt(i)&nbsp;-&nbsp;'0')&nbsp;*&nbsp;(t.charAt(j)&nbsp;-&nbsp;'0');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;处理进位&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;carry&nbsp;=&nbsp;0; for (int i = nums.length - 1; i >=&nbsp;0;&nbsp;i--)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;temp&nbsp;=&nbsp;nums[i]&nbsp;+&nbsp;carry;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nums[i]&nbsp;=&nbsp;temp&nbsp;%&nbsp;10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carry&nbsp;=&nbsp;temp&nbsp;/&nbsp;10;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;构建结果字符串&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuilder();&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;start&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start++;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;start;&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(nums[i]);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sb.toString();}大数乘法:public&nbsp;String&nbsp;solve(String&nbsp;s,&nbsp;String&nbsp;t)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s&nbsp;==&nbsp;null&nbsp;||&nbsp;t&nbsp;==&nbsp;null&nbsp;||&nbsp;s.length()&nbsp;==&nbsp;0&nbsp;||&nbsp;t.length()&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s.equals(&amp;quot;0&amp;quot;)&nbsp;||&nbsp;t.equals(&amp;quot;0&amp;quot;))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&amp;quot;0&amp;quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;nums&nbsp;=&nbsp;new&nbsp;int[s.length()&nbsp;+&nbsp;t.length()];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;计算乘积并累加到相应位置 for (int i = s.length() - 1; i >=&nbsp;0;&nbsp;i--)&nbsp;{ for (int j = t.length() - 1; j >=&nbsp;0;&nbsp;j--)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nums[i&nbsp;+&nbsp;j&nbsp;+&nbsp;1]&nbsp;+=&nbsp;(s.charAt(i)&nbsp;-&nbsp;'0')&nbsp;*&nbsp;(t.charAt(j)&nbsp;-&nbsp;'0');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;处理进位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;carry&nbsp;=&nbsp;0; for (int i = nums.length - 1; i >=&nbsp;0;&nbsp;i--)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;temp&nbsp;=&nbsp;nums[i]&nbsp;+&nbsp;carry;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nums[i]&nbsp;=&nbsp;temp&nbsp;%&nbsp;10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carry&nbsp;=&nbsp;temp&nbsp;/&nbsp;10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;构建结果字符串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuilder();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;start&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;start;&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(nums[i]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sb.toString();}
投递腾讯等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务