阿里云笔试 阿里云笔试题 算法岗 0511

笔试时间:2025年5月11日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:op 串问题

小红有一个长度为 n 的魔法环,环上依次有数字 a₁, a₂, …, aₙ 。她希望通过切开魔法环并对线性序列应用加权交替求和,得到最终魔法值。操作步骤如下:

选定一个断开位置 k (1 ≤ k ≤ n),将环从此位置切开,得到线性序列 b₁ = aₖ, b₂ = aₖ₊₁, …, bₙ₋ₖ₊₁ = aₙ, bₙ₋ₖ₊₂ = a₁, …, bₙ = aₖ₋₁ 。 对得到的线性序列 {bⱼ} 计算加权交替求和: S = 1・b₁ - 2・b₂ + 3・b₃ - 4・b₄ + … + (-1)ⁿ⁻¹n・bₙ 。

小红希望在所有可能的断开位置中,S 的值最大。请你计算并输出此最大值。

输入描述

第一行输入一个整数 n (1 ≤ n ≤ 2000),表示魔法环上的数字个数。 第二行输入 n 个整数 a₁, a₂, …, aₙ (0 ≤ aᵢ ≤ n),代表环上各位置的初始数字。

输出描述

输出一个整数,表示小红在所有断开位置的加权交替求和中能获得的最大魔法值。

样例输入

4

1 2 3 4

样例输出

4

解释: 当断开位置 k = 2 时,序列 [2, 3, 4, 1] 的加权交替求和为 2 - 6 + 12 - 4 = 4,这是所有 S 中的最大值。

参考题解

枚举所有可能的断开位置,生成线性序列后计算加权交替和,取最大值。

C++:

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

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    vector<int> b(2 * n);
    for (int i = 0; i < n; ++i) {
        b[i] = b[i + n] = a[i];
    }
    int max = -1e9;
    for (int k = 0; k < n; ++k) {
        int s = 0;
        int f = 1;
        for (int i = 0; i < n; ++i) {
            s += f * (i + 1) * b[k + i];
            f = -f;
        }
        if (s > max) {
            max = s;
        }
    }
    cout << max << endl;
    return 0;
}

Java:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        int[] a = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            a[i] = Integer.parseInt(st.nextToken());
        }
        // 构造 b 数组
        int[] b = new int[2 * n];
        for (int i = 0; i < n; i++) {
            b[i] = a[i];
            b[i + n] = a[i];
        }
        long max = Long.MIN_VALUE;
        for (int k = 0; k < n; k++) {
            long s = 0;
            int f = 1;
            for (int i = 0; i < n; i++) {
                s += (long)f * (i + 1) * b[k + i];
                f = -f;
            }
            if (s > max) {
                max = s;
            }
        }
        System.out.println(max);
    }
}

Python:

import sys

def main():
    data = sys.stdin.read().split()
    it = iter(data)
    n = int(next(it))
    a = [int(next(it)) for _ in range(n)]
    # 构造 b 数组
    b = a + a

    max_val = -10**18
    for k in range(n):
        s = 0
        f = 1
        for i in range(n):
            s += f * (i + 1) * b[k + i]
            f = -f
        if s > max_val:
            max_val = s

    print(max_val)

if __name__ == "__main__":
    main()

第二题

给定一个时间序列数据,你的任务是计算并输出该序列的自相关函数。自相关函数的定义如下: 对于一个时间序列 {Xₜ},其自相关函数 ρ(h) 定义为: ρ(h) = E [(Xₜ₊ₕ - μ)(Xₜ - μ)] / σ² 其中,E [・] 表示期望,μ 是序列的均值,σ² 是序列的方差,h 是滞后(lag)。你需要写一个 Python 函数,接受一个由浮点数构成的列表作为输入,输出一个列表,列表中的第 i 个元素是输入序列的滞后 i 的自相关系数。你可以假设输入列表的长度至少为 2,且所有的输入数据都是有效的。(只能用python3)

输入描述

输入一行浮点数,空格间隔。

输出描述

直接输出列表。

补充说明:你的程序需要能够处理任意长度的输入序列。 对于滞后大于序列长度的情况,自相关系数应被定义为 0。 所有的输出应该保留三位小数。

样例输入

1.0 2.0 3.0 4.0

样例输出

[4.0, 1.0, -1.2, -1.8]

参考题解

计算序列均值和方差。 对每个滞后值,计算协方差并除以方差得到自相关系数。 结果保留三位小数后输出。

Python:


  

第三题

给定一个 n 行 m 列的网格,且保证 n, m 都为偶数。我们用 (i, j) 表示第

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

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

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

全部评论

相关推荐

认真搞学习:他问你的已经是他的全部修为
查看4道真题和解析
点赞 评论 收藏
分享
06-18 14:34
门头沟学院 Java
黑皮白袜臭脚体育生:你现在应该先跟妈妈打电话聊,跟她讲讲来上海涨了很多见识,看到了一些什么风景,只是发现工作也没那么好找,然后说想爸爸了,也想她了,感觉现在压力好大,这样一个是可以减轻你的压力,毕竟你的压力一部分就来源于提前立了flag但是又做不到,被架住了,主动找妈妈打电话说就把这个事揭过去了,诉苦还能顺便缓解精神压力,一个是可以减轻妈妈的精神压力,因为她也不知道你什么情况,总会担心,加上爸爸上个月去世,即使她不说心里肯定也是很悲伤的,你这个时候跟她打电话会让她也振作起来,为母则刚,孩子过得不好她就会从悲伤中转移注意力到你身上,会说让你不急,工作慢慢找,你再顺势跟她说好的,让她不要因为伤心过度坏了身体,家里还有你在,即使工作不好找也会坚持努力下去,哪天机会来了就成功了,这样进一步降低她的压力,也表明你不是收到压力就退缩的懦夫,这样做至少能在一两个星期到一两个月内把压力降低到比较小的程度,如果一直维持高压状态即使机会来了也抓不住,全局来看降压势在必行,然后在上海没找到工作之前不要频繁打电话,没什么东西能讲,最后尬聊只会起反作用,应该隔段时间就给妈妈买点上海的特产寄回去,这样她感受到你孝心也不会后面主动施压你,进一步降低在找到工作前这段时间的压力,更利于找工作的沉淀和面试发挥,不用太贵的,礼轻情意重,当然如果要买贵的也可以,送佛送到西,我在放心借给你存了20w,自己申请自己去取吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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