【春招筆試】2025.05.11阿里云算法崗筆試真題改編
? 春招備戰(zhàn)指南 ?
?? 學習建議:
- 先嘗試獨立解題(建議用時:90分鐘/套)
- 對照解析查漏補缺
?? 題面描述背景等均已深度改編,做法和題目本質(zhì)基本保持一致。
?? 感謝各位朋友們的訂閱,你們的支持是我們創(chuàng)作的最大動力
?? 目前本專欄已經(jīng)上線60+套真題改編解析,后續(xù)會持續(xù)更新的
春秋招合集 -> 互聯(lián)網(wǎng)必備刷題寶典??
題目一:魔法環(huán)的加權(quán)切割
1??:枚舉所有可能的切割位置
2??:計算每個位置的加權(quán)交替和,找出最大值
難度:中等
這道題的關(guān)鍵在于理解加權(quán)交替和的計算方式,并通過枚舉所有可能的切割位置,找出最大值。由于數(shù)據(jù)范圍較小 ,O(n2) 的解法可以通過。實現(xiàn)時可以利用取模運算來簡化數(shù)組訪問。
題目二:時間序列自相關(guān)分析
1??:計算序列的均值和方差
2??:根據(jù)自相關(guān)函數(shù)公式計算各個延遲的相關(guān)系數(shù)
3??:按照要求的格式輸出結(jié)果
難度:中等
這道題需要理解自相關(guān)函數(shù)的定義,并正確實現(xiàn)計算過程。關(guān)鍵在于計算時間序列在不同延遲下與自身的相關(guān)性,處理好特殊情況(如方差為0)以及格式化輸出。
題目三:鏡像追蹤游戲
1??:理解角色和鏡像怪之間的對稱關(guān)系
2??:使用BFS找出所有可到達的空地位置
3??:檢查每個爆炸陷阱的鏡像位置是否可達
難度:中等偏難
這道題的突破口在于發(fā)現(xiàn)角色和鏡像怪之間的鏡像關(guān)系,利用廣度優(yōu)先搜索找出所有可到達的位置,然后檢查爆炸陷阱的鏡像位置是否在可到達集合中。理解這種空間對稱關(guān)系是解題的關(guān)鍵。
01. 魔法環(huán)的加權(quán)切割
問題描述
小柯?lián)碛幸粋€魔法環(huán),環(huán)上有 個數(shù)字
依次排列。她想通過一系列操作來獲得最大的魔法能量。操作步驟如下:
-
選擇一個位置
切開魔法環(huán),形成一個線性序列
,其中:
-
計算序列
的加權(quán)交替和:
小柯想知道,在所有可能的切割位置中,能獲得的最大魔法能量值是多少。
輸入格式
第一行包含一個整數(shù)
,表示魔法環(huán)上的數(shù)字個數(shù)。
第二行包含 個整數(shù)
,表示魔法環(huán)上的數(shù)字。
輸出格式
輸出一個整數(shù),表示所有切割位置中,能獲得的最大魔法能量值。
樣例輸入
4
1 2 3 4
5
1 4 2 3 5
樣例輸出
4
27
數(shù)據(jù)范圍
樣例1 | 當切割位置 |
樣例2 | 當切割位置 |
題解
這道題讓我們在魔法環(huán)的每個可能位置切開,然后計算加權(quán)交替和,找出最大值。
首先,我們需要理解什么是加權(quán)交替和。對于一個序列 ,加權(quán)交替和定義為:
這里的關(guān)鍵是"交替",意味著符號在 +1 和 -1 之間交替,而"加權(quán)"表示每個元素乘以它在序列中的位置。
由于魔法環(huán)的數(shù)字個數(shù) 最大為 2000,如果我們嘗試每個可能的切割位置,計算量為
,對于這個數(shù)據(jù)范圍是完全可接受的。
解題步驟如下:
- 枚舉所有可能的切割位置
(從 1 到
)
- 對于每個位置,構(gòu)建線性序列
- 計算該序列的加權(quán)交替和
- 更新最大值
實際編碼時,我們可以避免顯式構(gòu)建序列 ,直接通過取模運算
(k + i) % n
來訪問原始序列 中對應的元素。這樣可以節(jié)省空間。
時間復雜度為 ,對于
的約束來說是高效的。空間復雜度為
,主要用于存儲原始序列。
參考代碼
- Python
import sys
input = lambda: sys.stdin.readline().strip()
# 讀取輸入
n = int(input())
a = list(map(int, input().split()))
# 計算所有切割位置的加權(quán)交替和,找最大值
ans = float('-inf')
for k in range(n):
s = 0
for i in range(n):
sign = 1 if i % 2 == 0 else -1
w = i + 1
s += sign * w * a[(k + i) % n]
ans = max(ans, s)
# 輸出結(jié)果
print(ans)
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 讀取輸入
int n;
cin >> n;
vector<long long> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 枚舉所有切割位置
long long ans = LLONG_MIN;
for (int k = 0; k < n; k++) {
long long s = 0;
for (int i = 0; i < n; i++) {
long long sign = (i % 2 == 0) ? 1 : -1;
long long w = i + 1;
s += sign * w * a[(k + i) % n];
}
ans = max(ans, s);
}
// 輸出結(jié)果
cout << ans << endl;
return 0;
}
- Java
import java.io.*;
import java.util.*;
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());
long[] a = new long[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
a[i] = Long.parseLong(st.nextToken());
}
long ans = Long.MIN_VALUE;
for (int k = 0; k < n; k++) {
long s = 0;
for (int i = 0; i < n; i++) {
long sign = (i % 2 == 0) ? 1 : -1;
long w = i + 1;
s += sign * w * a[(k + i) % n];
}
ans = Math.max(ans, s);
}
System.out.println(ans);
}
}
02. 時間序列自相關(guān)分析
問題描述
小基 正在研究一種時間序列數(shù)據(jù)分析方法,她需要計算數(shù)據(jù)的自相關(guān)函數(shù)。自相關(guān)函數(shù)是衡量時間序列在不同時間延遲下與自身相關(guān)性的重要指標。
對于一個時間序列 ,其自相關(guān)函數(shù)
定義為:
其中:
表示期望值
是序列的均值
是序列的方差
是時間延遲(lag)
小基 需要編寫一個程序,接受一個浮點數(shù)序列作為輸入,然后輸出該序列在各個時間延遲下的自相關(guān)系數(shù)。
輸入格式
輸入一行浮點數(shù),用空格分隔。
輸出格式
輸出一個列表,包含序列在各個時間延遲下的自相關(guān)系數(shù),保留三位小數(shù)。
樣例輸入
1.0 2.0 3.0 4.0
樣例輸出
[4.0, 1.0, -1.2, -1.8]
數(shù)據(jù)范圍
- 輸入序列的長度至少為 2
- 對于時間延遲大于序列長度的情況,自相關(guān)系數(shù)定義為 0
樣例1 | 輸入序列為 [1.0, 2.0, 3.0, 4.0]。 計算均值 滯后0的自相關(guān)系數(shù): 滯后1的自相關(guān)系數(shù): 滯后2的自相關(guān)系數(shù): 滯后3的自相關(guān)系數(shù): |
題解
這道題要求我們計算時間序列的自相關(guān)函數(shù),這是時間序列分析中的一個基本概念。
自相關(guān)函數(shù)度量了時間序列在不同時間延遲下與自身的相關(guān)性。具體來說,對于延遲 ,我們需要計算:
解題步驟如下:
-
計算時間序列的均值
:
-
計算時間序列的方差
:
-
對于每個延遲
(從0到n-1),計算自相關(guān)系數(shù):
- 計算
- 將結(jié)果除以方差
- 計算
需要注意的是,隨著延遲的增加,可以用于計算的數(shù)據(jù)點對會減少。當延遲等于序列長度時,沒有數(shù)據(jù)點對可以計算,此時自相關(guān)系數(shù)定義為0。
時間復雜度為 ,其中 n 是序列長度。雖然對于長序列來說計算量較大,但對于這個問題的數(shù)據(jù)范圍來說是可以接受的。
參考代碼
- Python
import sys
input = lambda: sys.stdin.readline().strip()
# 讀取輸入數(shù)據(jù)
x = list(map(float, input().split()))
n = len(x)
# 計算均值
mu = sum(x) / n
# 計算方差
var = sum((xi - mu) ** 2 for xi in x) / n
# 計算自相關(guān)系數(shù)
res = []
for h in range(n):
num = 0
for i in range(n - h):
num += (x[i + h] - mu) * (x[i] - mu)
# 如果方差為0,自相關(guān)系數(shù)為0
corr = num / var if var > 0 else 0
res.append(round(corr, 1))
# 輸出結(jié)果
print(res)
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
// 關(guān)閉同步,加速輸入輸出
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 讀取輸入
string line;
getline(cin, line);
istringstream iss(line);
vector<double> x;
double val;
while (iss >> val) {
x.push_back(val);
}
int n = x.size();
// 計算均值
double mu = 0;
for (double xi : x) {
mu += xi;
}
mu /= n;
// 計算方差
double var = 0;
for (double xi : x) {
var += (xi - mu) * (xi - mu);
}
var /= n;
// 計算各延遲的自相關(guān)系數(shù)
vector<double> res(n);
for (int h = 0; h < n; h++) {
double num = 0;
for (int
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
互聯(lián)網(wǎng)刷題筆試寶典,這里涵蓋了市面上大部分的筆試題合集,希望助大家春秋招一臂之力