网易笔试 网易笔试题 0921

笔试时间:2024年09月21日 秋招

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

第一题

题目

小明家附近有两个购物超市A、B,两家超市中的商品种类都一致齐全,其中A超市离小明家更近,是小明购物的首选超市,但是B超市的有些商品会比A超市价格便宜,而且B超市有个购物规定,每次买东西只能选1件或多件相互挨着的商品,不能随意挑选。假设小明要采购一系列商品,每件只购买一次,只能在A或B超市中采购,并且他最多只去B超市采购一次,请你帮助计算本次采购全部商品清单所需的最低费用。

输入描述

输入包括两行,每行均为n个数字,用空格分隔,1<=n<10000000

第一行为本次需采购的n个商品在A超市的价格列表

第二行为本次需采购的n个商品在B超市的价格列表第二行非0正整数,且小于100。

输出描述

最低费用。

样例输入

36 87 47 55 51

39 77 46 57 50

样例输出

265

参考题解

作差,D[i] = B[i] - A[i]。然后求D数组的最小连续子数组和 min,输出 sum(A) + min。

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

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string lineA;
    getline(cin, lineA);
    string lineB;
    getline(cin, lineB);
    vector<int> A;
    int num;
    ll sumA = 0;
    stringstream ssA(lineA);
    while (ssA >> num)
    {
        A.push_back(num);
        sumA += num;
    }

    stringstream ssB(lineB);
    ll min_s = 0;
    ll cur_s = 0;
    int i = 0;
    while (ssB >> num && i < A.size())
    {
        int D = num - A[i];
        cur_s += D;
        if (cur_s < min_s)
        {
            min_s = cur_s;
        }
        if (cur_s > 0)
        {
            cur_s = 0;
        }
        i++;
    }

    ll ans = sumA + min_s;
    if (min_s >= 0)
    {
        ans = sumA;
    }

    cout << ans;
}

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

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

第二题

题目

有一座城市共有n个公交站点,站点编号为0到n-1。共有m辆公交车,每辆公交车的运行区间为a-b,表示公交车从a站点运行到b站点(a < b),乘客可以在区间内的任意站点上下车进行换乘。小明需要从x站点乘坐公交到达v站点,请问至少需要乘坐几趟公交车?如果无法到达,则返回-1。如果起点和终点相同,则返回0。

输入描述

第一行输入为站点数n和公交数m,其中2<=n<=100,1<=m<=50

第二行输入为小明的起点站x和终点站y,其中0<=x<=y<=n-1

接下来m行为每趟公交车的起点站a和终点站b,其中0<=a<b<=n-1。

输出描述

输出最小需乘坐的公交次数,如果无法到达,则返回-1。如果起点和终点相同,则返回 0。

补充说明:m辆公交车的区间都不相同,但区间可能存在重叠。可将公交车视为单向运行,不用考虑往返

样例输入一

5 3

0 4

0 2

1 3

3 4

样例输出一

3

说明:第一趟从站点0乘坐到站点2,第二趟从站点2乘坐到站点3,第三趟从站点3乘坐到站点4,最少需要乘坐3趟公交。

样例输入二

3 1

0 2

0 1

样例输出二

-1

说明:无法达到

样例输入三

4 4

1 1

0 1

1 2

2 3

0 3

样例输出三

0

说明:小明从站点1到1不用车

参考题解

bfs。

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

#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m;
    while (cin >> n >> m)
    {
        int x, y;
        cin >> x >> y;
        vector<pair<int, int>> buses(m);
        for (auto &p : buses)
            cin >> p.first >> p.second;
        if (x == y)
        {
            cout << 0 << "\n";
            continue;
        }
        unordered_map<int, vector<int>> g;
        for (int i = 0; i < m; i++)
        {
            for (int j = buses[i].first; j <= buses[i].second; j++)
            {
                g[j].push_back(i);
            }
        }
        queue<int> q;
        vector<bool> vis1(n, false);
        vector<bool> vis2(m, false);
        q.push(x);
        vis1[x] = true;
        int res = 0;
        bool found = false;
        while (!q.empty())
        {
            int size = q.size();
            res++;
            for (int i = 0; i < size; i++)
            {
                int current = q.front();
                q.pop();
                for (auto bus : g[current])
                {
                    if (vis2[bus])
                        continue;
                    vis2[bus] = true;
                    for (int j = buses[bus].first; j <= buses[bus].second; j++)
                    {
                        if (j == y)
                        {
                            found = true;
                            break;
                        }
                        if (!vis1[j])
                        {
                            vis1[j] = true;
                            q.push(j);
                        }
                    }
                    if (found)
                        break;
                }
                if (found)
                    break;
            }
            if (found)
            {
                cout << res << "\n";
                break;
            }
        }
        if (!found)
            cout << -1 << "\n";
    }
}

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

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int n = sc.nextInt();
            int m = sc.nextInt();
            int x = sc.nextInt();
            int y = sc.nextInt();

            List<int[]> buses = new ArrayList<>();
            for (int i = 0; i < m; i++) {
                int first = sc.nextInt();
                int second = sc.nextInt();
                buses.add(new int[]{first, second});
            }

            if (x == y) {
                System.out.println(0);
                continue;
            }

            Map<Integer, List<Integer>> g = new HashMap<>();
            for (int i = 0; i < m; i++) {
                for (int j = buses.get(i)[0]; j <= buses.get(i)[1]; j++) {
                    g.computeIfAbsent(j, k -> new ArrayList<>()).add(i);
                }
            }

            Queue<Integer> q = new LinkedList<>();
            boolean[] vis1 = new boolean[n + 1];
            boolean[] vis2 = new boolean[m];
            q.add(x);
            vis1[x] = true;
            int res = 0;
            boolean found = false;

            while (!q.isEmpty()) {
                int size = q.size();
                res++;
                for (int i = 0; i < size; i++) {
                    int current = q.poll();
                    for (int bus : g.getOrDefault(current, new ArrayList<>())) {
                        if (vis2[bus]) continue;
                        vis2[bus] = true;
                        for (int j = buses.get(bus)[0]; j <= buses.get(bus)[1]; j++) {
                            if (j == y) {
                                found = true;
                                break;
                            }
                            if (!vis1[j]) {
                                vis1[j] = true;
                                q.add(j);
                            }
                        }
                        if (found) break;
                    }
                    if (found) break;
                }
                if (found) {
                    System.out.println(res);
                    break;
                }
            }
            if (!found) System.out.println(-1);
        }
        sc.close();
    }
}

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

from collections import deque, defaultdict

while True:
    try:
        n, m = map(int, input().split())
        x, y = map(int, input().split())
        buses = []

        for _ in range(m):
            first, second = map(int, input().split())
            buses.append((first, second))

        if x == y:
            print(0)
            continue

        g = defaultdict(list)
        for i in range(m):
            for j in range(buses[i][0], buses[i][1] + 1):
                g[j].append(i)

        q = deque([x])
        vis1 = [False] * (n + 1)
        vis2 = [False] * m
        vis1[x] = True
        res = 0
        found = False

        while q:
            size = len(q)
            res += 1
            for _ in range(size):
                current = q.popleft()
                for bus in g[current]:
                    if v

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

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

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

全部评论
您好,请问题型只有算法题吗
点赞 回复 分享
发布于 09-27 21:56 台湾
不懂就问,第二题直接合并区间,合并完看y在不在区间内,在的话返回合并次数不就好了吗
点赞 回复 分享
发布于 09-28 08:43 北京

相关推荐

点赞 评论 收藏
分享
点赞 9 评论
分享
牛客网
牛客企业服务