【春招筆試】2025.05.08-得物春招研發(fā)崗改編題
? 春招備戰(zhàn)指南 ?
?? 學(xué)習(xí)建議:
- 先嘗試獨(dú)立解題(建議用時(shí):90分鐘/套)
- 對照解析查漏補(bǔ)缺
?? 題面描述背景等均已深度改編,做法和題目本質(zhì)基本保持一致。
?? 感謝各位朋友們的訂閱,你們的支持是我們創(chuàng)作的最大動力
?? 目前本專欄已經(jīng)上線60+套真題改編解析,后續(xù)會持續(xù)更新的
春秋招合集 -> 互聯(lián)網(wǎng)必備刷題寶典??
題目一:螺旋迷宮蛇行挑戰(zhàn)
1??:分析螺旋路徑可能的碰撞情況
2??:根據(jù)路徑片段長度關(guān)系,判斷是否會相撞
難度:中等
這道題目的關(guān)鍵在于理解只能向右轉(zhuǎn)的螺旋路徑特性,并分析可能出現(xiàn)的碰撞情況。通過數(shù)學(xué)關(guān)系分析,我們可以得到判斷碰撞的條件,從而實(shí)現(xiàn)O(n)的高效解法,避免了復(fù)雜的路徑模擬。
題目二:魔法水晶共振組合
1??:分析三個數(shù)兩兩相乘為完全平方數(shù)的數(shù)學(xué)性質(zhì)
2??:將每個數(shù)拆分為無平方因子部分和平方因子部分
3??:統(tǒng)計(jì)無平方因子部分相同的數(shù)量,計(jì)算組合數(shù)
難度:中等偏難
這道題目結(jié)合了數(shù)論知識和組合計(jì)數(shù)。通過理解完全平方數(shù)的性質(zhì),發(fā)現(xiàn)滿足條件的三元組必須具有相同的無平方因子部分。利用埃氏篩和質(zhì)因數(shù)分解,可以高效地找出所有滿足條件的三元組數(shù)量。
題目三:矩陣魔法變換
1??:分析L形區(qū)域操作的特點(diǎn)和影響
2??:對于足夠大的矩陣,每次操作改變3個單元格的值
3??:檢查總和是否能被3整除或特殊情況判斷
難度:中等
這道題目需要洞察矩陣操作的數(shù)學(xué)本質(zhì)。關(guān)鍵發(fā)現(xiàn)是:當(dāng)矩陣足夠大時(shí),每次操作影響3個單元格,因此總和必須能被3整除才可能全部變?yōu)?。對于特殊情況(如行列數(shù)小于2),需要單獨(dú)判斷。這種解法將復(fù)雜問題簡化為簡單的數(shù)學(xué)關(guān)系判斷。
01. 螺旋迷宮蛇行挑戰(zhàn)
問題描述
小基 最近開發(fā)了一款創(chuàng)新的迷宮游戲,在這個游戲中,玩家控制的是一條只能向右轉(zhuǎn)彎的蛇形機(jī)器人。這意味著機(jī)器人的移動軌跡呈現(xiàn)單螺旋結(jié)構(gòu),如下圖所示:
小基 將機(jī)器人的移動路徑記錄為一系列直線段長度,即每次直行 的長度后,右轉(zhuǎn) 90 度繼續(xù)前進(jìn)?,F(xiàn)在,小基 想要確定機(jī)器人是否會在移動過程中撞到自己之前的路徑。
輸入格式
第一行輸入測試用例的個數(shù) 。
對于每一組測試用例,第一行輸入機(jī)器人路徑的段數(shù) 。
隨后一行給出 個正整數(shù)
,表示每一段直線的長度。
輸出格式
對于每一組測試用例,單獨(dú)輸出一行字符串。
若機(jī)器人會撞到自身路徑,輸出"",否則輸出"
"。
樣例輸入
1
6
5 7 11 12 16 17
1
6
2 3 4 4 7 7
樣例輸出
NO
NO
數(shù)據(jù)范圍
樣例1 | 機(jī)器人按照給定的路徑長度移動,不會與自己之前的路徑相撞 |
樣例2 | 機(jī)器人同樣不會與自己的路徑相撞 |
題解
這道題目考察的是判斷一條按照特定規(guī)則移動的"蛇"是否會與自身相撞。
首先,我們需要理解題目中的單螺旋結(jié)構(gòu):機(jī)器人只能向右轉(zhuǎn)彎(順時(shí)針旋轉(zhuǎn)90度),形成一個從內(nèi)到外的螺旋。給定的數(shù)組表示機(jī)器人每一段直線移動的長度,之后就會右轉(zhuǎn)。
判斷是否相撞,本質(zhì)上是檢查新的移動路徑是否會與之前的路徑相交。對于這種螺旋形狀,有幾種典型的碰撞情況:
- 當(dāng)前段與前前段相撞:第i段長度大于等于第(i-2)段,同時(shí)第(i-1)段長度小于等于第(i-3)段
- 當(dāng)前段與更早的段相撞:需要考慮特殊的幾何關(guān)系
通過分析可能的碰撞場景,我們可以得出幾個判斷條件:
- 如果第i段長度 >= 第(i-2)段長度,且第(i-1)段長度 <= 第(i-3)段長度,則會相撞
- 如果第(i-1)段長度等于第(i-3)段長度,且第i段長度 + 第(i-4)段長度 >= 第(i-2)段長度,則會相撞
- 還有更復(fù)雜的情況:當(dāng)?shù)?i-2)段長度 >= 第(i-4)段長度,且第i段長度 >= 第(i-2)段長度 - 第(i-4)段長度,同時(shí)第(i-1)段長度在一定范圍內(nèi)時(shí),也會相撞
時(shí)間復(fù)雜度為O(N),對于給定的數(shù)據(jù)范圍(N最大為10^5)完全可以接受。這種方法避免了模擬整個路徑的復(fù)雜性,而是通過純數(shù)學(xué)關(guān)系判斷是否會相撞。
參考代碼
- Python
import sys
input = lambda:sys.stdin.readline().strip()
def can_hit(lens):
# 判斷是否會碰撞的函數(shù)
for i in range(3, len(lens)):
# 情況1: 當(dāng)前段與前前段碰撞
if lens[i] >= lens[i-2] and lens[i-1] <= lens[i-3]:
return True
# 情況2: 特殊情況處理
if i >= 4 and lens[i-1] == lens[i-3] and lens[i] + lens[i-4] >= lens[i-2]:
return True
# 情況3: 更復(fù)雜的幾何關(guān)系
if (i >= 5 and lens[i-2] >= lens[i-4] and
lens[i] >= lens[i-2] - lens[i-4] and
lens[i-1] >= lens[i-3] - lens[i-5] and
lens[i-1] <= lens[i-3]):
return True
return False
def main():
# 讀取測試用例數(shù)
t = int(input())
for _ in range(t):
# 讀取路徑段數(shù)
n = int(input())
# 讀取每段長度
lens = list(map(int, input().split()))
# 判斷并輸出結(jié)果
print("Yes" if can_hit(lens) else "NO")
if __name__ == "__main__":
main()
- Cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// 判斷蛇是否會撞到自身
bool check_collision(const vector<ll>& lens) {
for (int i = 3; i < lens.size(); i++) {
// 第一種碰撞情況
if (lens[i] >= lens[i-2] && lens[i-1] <= lens[i-3]) {
return true;
}
// 第二種碰撞情況
if (i >= 4 && lens[i-1] == lens[i-3] &&
lens[i] + lens[i-4] >= lens[i-2]) {
return true;
}
// 第三種復(fù)雜碰撞情況
if (i >= 5 && lens[i-2] >= lens[i-4] &&
lens[i] >= lens[i-2] - lens[i-4] &&
lens[i-1] >= lens[i-3] - lens[i-5] &&
lens[i-1] <= lens[i-3]) {
return true;
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<ll> lens(n);
for (int i = 0; i < n; i++) {
cin >> lens[i];
}
bool hit = check_collision(lens);
cout << (hit ? "Yes" : "NO") << "\n";
}
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 t = Integer.parseInt(br.readLine().trim());
for (int tc = 0; tc < t; tc++) {
int n = Integer.parseInt(br.readLine().trim());
String[] tokens = br.readLine().trim().split(" ");
long[] lens = new long[n];
for (int i = 0; i < n; i++) {
lens[i] = Long.parseLong(tokens[i]);
}
boolean hit = checkHit(lens);
System.out.println(hit ? "Yes" : "NO");
}
}
// 檢查蛇是否會撞到自身
private static boolean checkHit(long[] lens) {
for (int i = 3; i < lens.length; i++) {
// 碰撞條件1
if (lens[i] >= lens[i-2] && lens[i-1] <= lens[i-3]) {
return true;
}
// 碰撞條件2
if (i >= 4 && lens[i-1] == lens[i-3] &&
lens[i] + lens[i-4] >= lens[i-2]) {
return true;
}
// 碰撞條件3
if (i >= 5 && lens[i-2] >= lens[i-4] &&
lens[i] >= lens[i-2] - lens[i-4] &&
lens[i-1] >= lens[i-3] - lens[i-5] &&
lens[i-1] <= lens[i-3]) {
return true;
}
}
return false;
}
}
02. 魔法水晶共振組合
問題描述
在小柯的魔法研究實(shí)驗(yàn)室中,有一種特殊的水晶具有奇妙的共振特性。當(dāng)三塊水晶的能量值分別為 、
和
時(shí),如果它們兩兩結(jié)合產(chǎn)生的共振能量(即
、
和
)都是完美平方能量(即某個整數(shù)的平方),那么這三塊水晶被稱為"共振三元組"。
小柯的實(shí)驗(yàn)室里有編號從 到
的水晶,每塊水晶的能量值等于其編號。她想知道在這些水晶中,有多少種不同的共振三元組組合,即滿足
且
、
和
都是完全平方數(shù)的三元組
的數(shù)量。
輸入格式
輸入一個正整數(shù) ,表示水晶的最大編號。
輸出格式
輸出一個整數(shù),表示滿足條件的共振三元組數(shù)量。
樣例輸入
9
16
樣例輸出
1
4
數(shù)據(jù)范圍
樣例1 | 當(dāng) |
樣例2 | 當(dāng) |
題解
這道題目要求我們找出滿足特定條件的三元組數(shù)量。條件是:三個數(shù) 、
、
兩兩相乘的結(jié)果都是完全平方數(shù)。
乍一看,似乎需要枚舉所有可能的三元組,但這樣會導(dǎo)致 的時(shí)間復(fù)雜度,對于
最大為
的情況來說太慢了。
仔細(xì)分析這個條件,如果 、
和
都是完全平方數(shù),那么這三個數(shù)有什么共同特性呢?
關(guān)鍵洞察:如果將每個數(shù)分解為質(zhì)因數(shù)的乘積,那么當(dāng)兩個數(shù)相乘結(jié)果為完全平方數(shù)時(shí),意味著它們共同的質(zhì)因數(shù)必須出現(xiàn)偶數(shù)次。
換個角度思考,我們可以將每個數(shù)表示為 ,其中
是無平方因子的部分(squarefree),
是平方因子。對于任意兩個數(shù)
和
,它們的乘積是完全平方數(shù)的條件是
。
基于這個觀察,我們可以計(jì)算每個 值出現(xiàn)的次數(shù),然后對于每個
值,我們從對應(yīng)的數(shù)中選取3個數(shù)的組合數(shù)量,即
。
算法步驟:
- 先預(yù)處理出每個數(shù)的最小質(zhì)因子(使用埃氏篩法)
- 對于每個數(shù)
從
到
,計(jì)算其無平方因子部分
- 統(tǒng)計(jì)每個
值出現(xiàn)的次數(shù)
- 對于每個
值,計(jì)算
并累加到答案中
時(shí)間復(fù)雜度為 ,主要在于質(zhì)因數(shù)分解的過程??臻g復(fù)雜度為
,用于存儲最小質(zhì)因子和計(jì)數(shù)。
參考代碼
- Python
import sys
input = lambda:sys.stdin.readline().strip()
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
互聯(lián)網(wǎng)刷題筆試寶典,這里涵蓋了市面上大部分的筆試題合集,希望助大家春秋招一臂之力