字节笔试 字节笔试题 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多种语言版本,持续更新中。

全部评论

相关推荐

hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
01-15 17:34
保定学院 Java
数学转码崽:学历没优势就得卷项目和实习啊,但是我看了一下你这个项目,什么雪花算法,搜索引擎,Docker,minio这些都属于通用的东西啊,根本不算亮点,没有任何业务相关性。 还有第二个看到统一鉴权,分片上传估计面试官都不想看了。连我一个偶尔刷刷牛客简历的都看多了,面试官估计早都看吐了。。。 秋招结束了,就尽量找找中小厂吧,毕竟你现在转行已经没时间了,高低有一段实习经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务