小米笔试 小米笔试题 小米0321春招实习笔试真题

笔试时间:2026年3月21日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:年会套圈

题目

小明在年会时得到了一次套圈机会,只要被小明套中的商品都可以全部送给小明。小明对每个商品都有一个喜好值 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 春招笔试合集 文章被收录于专栏

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务