【春招笔试】2025.05.17淘天机考研发岗真题改编题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题(建议用时:90分钟/套)
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线80+套真题改编解析,后续会持续更新的
春秋招合集 -> 互联网必备刷题宝典🔗
题目一:彩珠拼接大挑战
1️⃣:计算所有彩珠的总数量和最多的那种彩珠数量
2️⃣:利用公式min(sum, 2*(sum-max)+1)计算最终答案
难度:中等
这道题目的关键在于理解相邻彩珠不能相同的约束条件,通过数学推导得到一个简洁的公式。时间复杂度为O(1),只需要统计总数和最大值。
题目二:记忆碎片重组
1️⃣:分析能力值k的影响,当k≥3时可以无消耗排序
2️⃣:当k<3时,计算相邻数值对的逆序数
难度:中等
这道题目结合了排序和逆序数的概念,需要理解不同能力值下的交换规则。关键在于发现当k≥3时,任意排列都可以无消耗达到有序状态。
题目三:信号修复工程
1️⃣:尝试两种可能的初始值(0和1)
2️⃣:根据参考信号序列递推构建合法序列
3️⃣:计算与原序列的汉明距离,取最小值
难度:中等
这道题目需要理解二进制信号序列的关系规则,发现一旦确定起始位置的值,整个序列就可以唯一确定。通过尝试两种可能的起始值,找到最小修改次数。
01. 彩珠拼接大挑战
问题描述
小柯开了一家手工饰品店,最近收到了一批彩珠订单。每种颜色的彩珠数量各不相同,她需要将这些彩珠串成一条手链。根据设计要求,相邻的彩珠不能是同一种颜色,否则会影响美观。
小柯有 26 种不同颜色的彩珠(分别对应小写字母 a 到 z),她想知道在满足设计要求的前提下,最长能制作多长的手链。
输入格式
第一行包含一个整数 (
),表示测试用例的数量。
对于每个测试用例:
一行包含 个整数
(
),分别表示 a 到 z 这 26 种颜色彩珠的数量。
输出格式
对于每个测试用例,输出一个整数,表示满足条件的最长手链长度。
样例输入
3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5
样例输出
2
3
30
数据范围
样例1 | 只有y和z各1个,可以交替排列,最长为2 |
样例2 | 有x、y、z分别为1,1,1个,可以形成"xyz"的序列,长度为3 |
样例3 | 每种字母都有一定数量,可以通过合理安排得到最长30的手链 |
题解
这是一个关于如何最大化使用彩珠的问题,同时保证相邻彩珠颜色不同。
首先,让我们思考一下问题的本质。如果我们想要制作一条尽可能长的手链,我们需要考虑两个关键因素:
- 彩珠的总数量
- 某种颜色彩珠的最大数量
为什么这两个因素很重要?因为如果某种颜色的彩珠太多,就无法全部放入手链中。具体来说,每种颜色的彩珠在手链中不能相邻,这意味着:
- 如果某种颜色的彩珠数量为M,那么至少需要M-1个其他颜色的彩珠来分隔它们
- 再加上可能的首尾两个位置
设所有彩珠的总数为sum,最多的那种颜色的彩珠数量为M。
我们有两种情况:
- 如果 M ≤ (sum - M + 1),那么我们可以将所有彩珠都放入手链,答案为sum
- 否则,我们最多只能放入 2*(sum-M)+1 个彩珠(sum-M个其他颜色的彩珠可以分隔sum-M+1个最多颜色的彩珠)
因此,最终答案是 min(sum, 2*(sum-M)+1)。
这个解法的时间复杂度是O(1),只需要遍历26个字母统计总数和最大值即可,非常高效。
参考代码
- Python
import sys
input = lambda:sys.stdin.readline().strip()
def solve():
t = int(input())
for _ in range(t):
# 读取每种颜色彩珠的数量
beads = list(map(int, input().split()))
# 计算总数和最大值
total = sum(beads)
max_cnt = max(beads)
# 计算最长可能的手链长度
result = min(total, 2 * (total - max_cnt) + 1)
print(result)
if __name__ == "__main__":
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve() {
int t;
cin >> t;
while (t--) {
// 读取26种颜色的彩珠数量
ll cnt[26], sum = 0, mx = 0;
for (int i = 0; i < 26; i++) {
cin >> cnt[i];
sum += cnt[i];
mx = max(mx, cnt[i]);
}
// 计算最长可能的手链长度
ll ans = min(sum, 2 * (sum - mx) + 1);
cout << ans << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
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());
while (t-- > 0) {
// 读取26种颜色的彩珠数量
String[] line = br.readLine().trim().split(" ");
long sum = 0, maxVal = 0;
for (int i = 0; i < 26; i++) {
long val = Long.parseLong(line[i]);
sum += val;
maxVal = Math.max(maxVal, val);
}
// 计算最长可能的手链长度
long ans = Math.min(sum, 2 * (sum - maxVal) + 1);
System.out.println(ans);
}
}
}
02. 记忆碎片重组
问题描述
小毛是一位记忆力衰退的老人,他最近在接受一种特殊的记忆恢复治疗。医生将他的记忆碎片具象化为一排卡片,每张卡片上标记着记忆发生的时间。理想情况下,这些记忆应该按照时间顺序排列,但现在它们被打乱了。
为了恢复记忆,小毛需要将这些卡片重新排序。根据治疗规则:
- 小毛有一个"记忆连接能力值"K,每次他可以选择两张时间差不超过K的卡片交换位置
- 对于时间差恰好为1的相邻记忆,交换它们需要消耗1点"精神力"
- 对于时间差大于1的记忆,交换不消耗精神力
小毛想知道,要将所有记忆卡片按时间顺序排列,他最少需要消耗多少精神力。
输入格式
第一行包含两个整数 和
(
;
),分别表示记忆碎片的数量和记忆连接能力值。
第二行包含 个不同的整数
(
),其中
表示第
张卡片上记录的时间。保证
是
到
的一个排列。
输出格式
输出一个整数,表示小毛最少需要消耗的精神力。
样例输入
4 1
2 1 3 4
4 3
2 1 3 4
样例输出
1
0
数据范围
样例1 | 当k=1时,我们只能交换相邻的卡片。交换第1张和第2张卡片就能得到正确顺序,因为它们的时间值分别是2和1,差值为1,所以需要消耗1点精神力 |
样例2 | 当k=3时,可以通过三次交换得到正确顺序:先交换1和4位置的卡片得到{2,4,3,1},再交换1和2位置的卡片得到{4,2,3,1},最后交换1和4位置的卡片得到{1,2,3,4}。这三次交换都不需要消耗精神力 |
题解
这道题目是关于记忆碎片重排序的问题,重点在于理解"精神力"消耗的规则和能力值K的作用。
首先,我们需要注意到一个关键点:每个卡片上的时间值是1到n的一个排列,这意味着最终我们要将卡片排成[1,2,3,...,n]的顺序。
让我们分析两种不同的情况:
-
当能力值 k ≥ 3 时:
这种情况下,我们可以交换任何两个时间差大于1的卡片而不消耗精神力。通过分析可以发现,任何排列都可以通过一系列这样的交换达到有序状态。
具体来说,我们可以采用类似选择排序的策略:每次找到当前应该在位置i的元素(值为i的元素),将它与位置i的元素交换。由于k≥3,这些交换都是允许的,并且不消耗精神力。
因此,当k≥3时,答案总是0。
-
当能力值 k < 3 时:
- 当k=1时,我们只能交换相邻位置的卡片
- 当k=2时,我们可以交换相邻或间隔一个位置的卡片
在这种情况下,我们需要计算"相邻数值对的逆序数"。也就是说,我们要统计所有满足以下条件的数对(x,x+1)的数量:x的位置在x+1的位置之后。
这实际上是在计算排序过程中必须交换的相邻数值对的数量,每次这样的交换都会消耗1点精神力。
这个解法的时间复杂度是O(n),其中n是卡片的数量。空间复杂度也是O(n),用于存储位置数组。
参考代码
- Python
import sys
input = lambda:sys.stdin.readline().strip()
def so
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力