米哈游笔试 米哈游笔试题 0328

笔试时间:2025年03月28日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目:数字凸包区间

米小游有 n 个整数 {a_1,a_2,...,a_n} ,他定义区间 [l,r] 的“数字凸包区间”为 [min{a_l,...,a_r},max{a_l,..,a_r}] 。 现在,对于每一个 i=1,2,....,n ,直接输出不属于 [1,i] 这个区间的“数字凸包区间”的最小非负整数。

输入描述

第一行输入两个整数 n (1 <= n <= 10^5 ) 代表整数数量、询问次数。

第二行输入 n 个整数 a_1,a_2,...,a_n ( 0 <= a_i <=10^9) 代表元素。

输出描述

在一行上输出 n 个整数,代表对于每一个 i 的答案。

样例输入

5

1 0 4 5 1

样例输出

0 2 5 6 6

说明:

对于第一次询问,“数字凸包区间”为 [1,1] ,不属于这个“数字凸包区间”的最小非负整数为 0 。 对于第二次询问,“数字凸包区间”为 [0,1] ,不属于这个“数字凸包区间”的最小非负整数为 2 。

参考题解

需要为每个前i个元素构成的区间找到不属于其“数字凸包区间”的最小非负整数。这里的“数字凸包区间”定义为区间内元素的最小值和最大值构成的闭区间。若当前区间的最小值 min > 0,则最小的缺失非负整数一定是 0(因为0不在闭区间内)。若当前区间的最小值 min = 0,则最小的缺失非负整数是 max + 1(因为闭区间覆盖了0到max的所有整数)。

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

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n), result(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    int min_val = a[0];
    int max_val = a[0];

    for (int i = 0; i < n; ++i) {
        if (i > 0) {
            min_val = min(min_val, a[i]);
            max_val = max(max_val, a[i]);
        }
        if (min_val > 0) {
            result[i] = 0;
        } else {
            result[i] = max_val + 1;
        }
    }

    for (int i = 0; i < n; ++i) {
        cout << result[i];
        if (i < n - 1) cout << " ";
    }
    cout << endl;

    return 0;
}

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

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        int[] result = new int[n];

        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }

        int minVal = a[0];
        int maxVal = a[0];

        for (int i = 0; i < n; i++) {
            if (i > 0) {
                minVal = Math.min(minVal, a[i]);
                maxVal = Math.max(maxVal, a[i]);
            }
            if (minVal > 0) {
                result[i] = 0;
            } else {
                result[i] = maxVal + 1;
            }
        }

        for (int i = 0; i < n; i++) {
            System.out.print(result[i]);
            if (i < n - 1) System.out.print(" ");
        }
        System.out.println();

        scanner.close();
    }
}

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

n = int(input())
a = [int(c) for c in input().split()]

min_val = a[0]
max_val = a[0]
result = []

for i in range(n):
    if i > 0:
        min_val = min(min_val, a[i])
        max_val = max(max_val, a[i])
    if min_val > 0:
        result.append(0)
    else:
        result.append(max_val + 1)

print(' '.join(map(str, result)))

第二题

题目:最大面积

给定一个长度为 n 的二进制字符串 s,由 0 和 1 字符组成。我们需要构建一个行数为 n,列数为 n 的方表,由 0 和 1 字符组成。第一行为原始字符串 s,第二行为字符串 s 向右循环移动一个,第三行为字符串 s 向右循环移动两个,以此类推。求表中所有由 0 组成的三角形或矩形的最大面积值。第一行是字符串 s。 第二行是字符串 s 向右循环移动一个位置。 第 i 行是字符串 s 向右循环移动 i-1 个位置。

输入描述

输入一个长度为 n 的二进制字符串 s,仅包含 0 和 1 字符,其中 1 < n < 5000。

输出描述

输出表中所有由 0 组成的三角形或矩形的最大面积值。

样例输入

00110

样例输出

6

说明:

在构造的方表中,最大由 0 组成的矩形面积为 6,构造的表格如下: 00110 00011 10001 11000 01100

参考题解

此题目看似类似LEETCODE的85题***********

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

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务