字节笔试 字节笔试题 0929

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

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

第一题

题目

有n个插在数轴上的木板,其中第i块木板高度为ai,相邻木板之间的宽度为1,木板本身的宽度忽略不计。

现在要使用这n个木板来接雨水,想知道如他可以提前调整这些木板的排列顺序,那么最多可以接多少雨水?

输入描述

第一行输入一个整数 n(2 <= n <= 2 * 10^5)代表数组中的元素数量。

第二行输入n个整数a1,a2,...an表示每块木板的高度。

输出描述

在一行上输出一个整数,代表在任意排列所有木板后,可以接到雨水的最大量。

样例输入

4

1 3 4 5

样例输出

12

参考题解

模拟。

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

#include <bits/stdc++.h>

using namespace std;

long long maxRainwater(int n, vector<long long>& heights) {
    // 找到最高和第二高的木板
    long long max1 = LLONG_MIN, max2 = LLONG_MIN;

    for (long long height : heights) {
        if (height > max1) {
            max2 = max1;
            max1 = height;
        } else if (height > max2) {
            max2 = height;
        }
    }

    // 计算可以接的雨水总量
    return max2 * (n - 1);
}

int main() {
    int n;
    cin >> n;
    vector<long long> heights(n); // 使用 long long 类型

    for (int i = 0; i < n; i++) {
        cin >> heights[i];
    }

    // 输出结果
    cout << maxRainwater(n, heights) << endl;
    return 0;
}

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

import java.util.Scanner;

public class MaxRainwater {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取输入
        int n = scanner.nextInt();
        long[] heights = new long[n];
        for (int i = 0; i < n; i++) {
            heights[i] = scanner.nextLong(); // 使用 long 类型
        }

        // 计算接水量
        System.out.println(maxRainwater(n, heights));
    }

    public static long maxRainwater(int n, long[] heights) {
        // 找到最高和第二高的木板
        long max1 = Long.MIN_VALUE;
        long max2 = Long.MIN_VALUE;

        for (long height : heights) {
            if (height > max1) {
                max2 = max1;
                max1 = height;
            } else if (height > max2) {
                max2 = height;
            }
        }

        // 计算可以接的雨水总量
        return max2 * (n - 1);
    }
}

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

def max_rainwater(n, heights):
    # 找到最高和第二高的木板
    max1 = max(heights)
    heights.remove(max1)  # 移除最高木板后再找第二高
    max2 = max(heights)

    # 计算可以接的雨水总量
    rainwater = max2 * (n - 1)
    return rainwater

# 读取输入
n = int(input())
heights = list(map(int, input().split()))

# 输出结果
print(max_rainwater(n, heights))

第二题

题目

小苯有一个长度为n的数组a1, a2, a3...an,和一个初始为空的双端队列q。在这里,双端队列是一种数据结构,其两端都可以放入元素,你可以参考样例解释获得更形象的说明。他想要将数组中的元素从左到右依次取出、放入q中。是否存在一种放入方式,使得全部数字放入后,q中的元素从左到右单调不降。

输入描述

每个测试文件均包含多组测试数据。

第一行输入一个整数T(1<= T <= 10 ^4 )代表数据组数,每组测试数据描述如下:

第一行输入一个正整数n代表数组中的元素数量。

第二行输入n个整数a1, a2, ...ai,代表数组中的元素。

输出描述

对于每一组测试数据,如果存在这样的放入方式,在一行上输出YES,否则,直接输出NO。

样例输入

3

4

2 3 1 4

3

1 1 1

1 3 2

样例输出

YES

YES

NO

参考题解

贪心的根据当前元素与队列两端元素的大小关系,选择小的来插入,以确保队列单调不降。如果无法满足条件,则返回 "NO"。

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

#include <iostream>
#include <deque>
#include <vector>
#include <string>

using namespace std;

string canFormNonDecreasingQueue(int n, vector<int>& a) {
    deque<int> q;
    for (int num : a) {
        if (q.empty()) { // 如果队列为空,直接放入
            q.push_back(num);
        } else {
            // 比较并决定放入左端还是右端
            if (num >= q.back()) { // 如果当前元素大于等于右端元素,放右边
                q.push_back(num);
            } else if (num <= q.front()) { // 如果当前元素小于等于左端元素,放左边
                q.push_front(num);
            } else { // 如果两者都不符合,返回 NO
                return "NO";
            }
        }
    }
    return "YES";
}

int main() {
    int T;
    cin >> T; // 读取测试案例数量
    string results;

    for (int i = 0; i < T; i++) {
        int n;
        cin >> n; // 读取每个测试案例的元素数量
        vector<int> a(n);
        for (int j = 0; j < n; j++) {
            cin >> a[j]; // 读取元素
        }
        results += canFormNonDecreasingQueue(n, a) + "\n"; // 将结果加入结果字符串
    }
    cout << results; // 输出所有结果
    return 0;
}

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

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Main{
    public static String canFormNonDecreasingQueue(int n, int[] a) {
        Deque<Integer> q = new ArrayDeque<>();
        for (int num : a) {
            if (q.isEmpty()) { // 如果队列为空,直接放入
                q.add(num);
            } else {
                // 比较并决定放入左端还是右端
                if (num >= q.peekLast()) { // 如果当前元素大于等于右端元素,放右边
                    q.add(num);
                } else if (num <= q.peekFirst()) { // 如果当前元素小于等于左端元素,放左边
                    q.addFirst(num);
                } else { // 如果两者都不符合,返回 NO
                    return "NO";
                }
            }
        }
        return "YES";
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt(); // 读取测试案例数量
        StringBuilder results = new StringBuilder();

        for (int i = 0; i < T; i++) {
            int n = scanner.nextInt(); // 读取每个测试案例的元素数量
            int[] a = new int[n];
            for (int j = 0; j < n; j++) {
                a[j] = scanner.nextInt(); // 读取元素
            }
            results.append(canFormNonDecreasingQueue(n, a)).append("\n");
        }
        System.out.print(results); // 输出所有结果
        scanner.close();
    }
}

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

from collections import deque

def can_form_non_decreasing_queue(n, a):
    q = deque()
    for num in a:
        if not q:  # 如果队列为空,直接放入
            q.append(num)
        else:
            # 比较并决定放入左端还是右端
            if num >= q[-1]:  # 如果当前元素大于等于右端元素,放右边
                q.append(num)
            elif num <=

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

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

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

全部评论

相关推荐

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