小米笔试 小米笔试题 小米0321春招实习笔试真题
笔试时间:2026年3月21日
往年笔试合集:
第一题:年会套圈
题目
小明在年会时得到了一次套圈机会,只要被小明套中的商品都可以全部送给小明。小明对每个商品都有一个喜好值 a_i。小明的套圈技术十分精准,可以指哪套哪,请你帮小明决定一个套圈位置,使得小明能获得的商品喜好值之和最大。你只用告诉小明这个最大值就可以了。
形式化地,n 个商品一列排开,小明对其喜好值分别为 a_1, a_2, ..., a_n。套圈的大小为 L,即可以任选套圈位置 i (1 ≤ i ≤ n-L+1),小明获得的商品为区间 [i, i+L-1],喜好值之和为:a_i + a_{i+1} + a_{i+2} + ... + a_{i+L-1}。
你需要决定一个位置 i,使得上述喜好值之和最大。你只用输出这个最大值。
输入描述
第一行 2 个整数分别为 n 和 L,表示商品数量和套圈的大小。
第二行 n 个整数 a_1, a_2, ..., a_n,表示各个商品的喜好值。
约束:1 ≤ L ≤ n ≤ 50000,0 ≤ a_i < 1000
输出描述
输出一个整数,表示能获得的最大喜好值之和。
样例输入
5 3 7 1 2 5 5
样例输出
12
样例解释
从第 3 个位置套圈,套中区间 [3, 5] 内的商品,其喜好值之和为 12,可以证明没有更优选择。
参考题解
解题思路:
核心是"滑动窗口"。求长度固定的连续子数组的最大和,可以先计算前 L 个元素的和作为初始窗口。接着窗口向右滑动,每次只需加上新进入窗口的元素并减去移出窗口的元素,就能以 O(1) 的时间更新当前和并维护最大值,整体时间复杂度为 O(n)。
C++:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int numItems, ringSize;
if (!(cin >> numItems >> ringSize)) {
return 0;
}
vector<int> preferences(numItems);
for (int i = 0; i < numItems; ++i) {
cin >> preferences[i];
}
long long currentSum = 0;
// 计算第一个窗口(大小为 ringSize)的喜好值之和
for (int i = 0; i < ringSize; ++i) {
currentSum += preferences[i];
}
long long maxSum = currentSum;
// 滑动窗口:减去移出窗口的元素,加上新进入窗口的元素
for (int i = ringSize; i < numItems; ++i) {
currentSum += preferences[i] - preferences[i - ringSize];
if (currentSum > maxSum) {
maxSum = currentSum;
}
}
cout << maxSum << "\n";
return 0;
}
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int numItems = sc.nextInt();
int ringSize = sc.nextInt();
int[] preferences = new int[numItems];
for (int i = 0; i < numItems; i++) {
preferences[i] = sc.nextInt();
}
long currentSum = 0;
// 计算第一个窗口(大小为 ringSize)的喜好值之和
for (int i = 0; i < ringSize; i++) {
currentSum += preferences[i];
}
long maxSum = currentSum;
// 滑动窗口:减去移出窗口的元素,加上新进入窗口的元素
for (int i = ringSize; i < numItems; i++) {
currentSum += preferences[i] - preferences[i - ringSize];
if (currentSum > maxSum) {
maxSum = currentSum;
}
}
System.out.println(maxSum);
}
}
Python:
import sys
input = sys.stdin.readline
def main():
n, L = map(int, input().split())
a = list(map(int, input().split()))
# 计算第一个窗口(大小为 L)的喜好值之和
current_sum = sum(a[:L])
max_sum = current_sum
# 滑动窗口:减去移出窗口的元素,加上新进入窗口的元素
for i in range(L, n):
current_sum += a[i] - a[i - L]
if current_sum > max_sum:
max_sum = current_sum
print(max_sum)
main()
第二题:装备挑选
题目
在某款角色扮演游戏中,玩家的角色拥有三项核心属性:力量、敏捷和智力。
你的仓库中目前存储了 N 件装备,每一件装备都拥有这三项属性的数值。第 i 件装备的力量值为 x_i,敏捷值为 y_i,智力值为 z_i。需要注意的是,这些数值可能为负数。
为了应对即将到来的高难度副本,你需要从这 N 件装备中恰好挑选出 M 件进行装备。装备穿戴后,角色的最终属性值为所选 M 件装备对应属性值的代数和,即:
- 最终力量 X = x_1 + x_2 + ... + x_M
- 最终敏捷 Y = y_1 + y_2 + ... + y_M
- 最终智力 Z = z_1 + z_2 + ... + z_M
为了追求极致的战斗风格,角色强度评分为三项最终属性值的绝对值之和,即 |X| + |Y| + |Z|。
请计算一下,如何从 N 件装备中挑选 M 件,才能使得角色的强度评分最大?
输入描述
第一行
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

