米哈游笔试 米哈游笔试题 0328
笔试时间:2025年03月28日
历史笔试传送门:
第一题
题目:数字凸包区间
米小游有 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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南