【春招笔试】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的手链

题解

这是一个关于如何最大化使用彩珠的问题,同时保证相邻彩珠颜色不同。

首先,让我们思考一下问题的本质。如果我们想要制作一条尽可能长的手链,我们需要考虑两个关键因素:

  1. 彩珠的总数量
  2. 某种颜色彩珠的最大数量

为什么这两个因素很重要?因为如果某种颜色的彩珠太多,就无法全部放入手链中。具体来说,每种颜色的彩珠在手链中不能相邻,这意味着:

  • 如果某种颜色的彩珠数量为M,那么至少需要M-1个其他颜色的彩珠来分隔它们
  • 再加上可能的首尾两个位置

设所有彩珠的总数为sum,最多的那种颜色的彩珠数量为M。

我们有两种情况:

  1. 如果 M ≤ (sum - M + 1),那么我们可以将所有彩珠都放入手链,答案为sum
  2. 否则,我们最多只能放入 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. 记忆碎片重组

问题描述

小毛是一位记忆力衰退的老人,他最近在接受一种特殊的记忆恢复治疗。医生将他的记忆碎片具象化为一排卡片,每张卡片上标记着记忆发生的时间。理想情况下,这些记忆应该按照时间顺序排列,但现在它们被打乱了。

为了恢复记忆,小毛需要将这些卡片重新排序。根据治疗规则:

  1. 小毛有一个"记忆连接能力值"K,每次他可以选择两张时间差不超过K的卡片交换位置
  2. 对于时间差恰好为1的相邻记忆,交换它们需要消耗1点"精神力"
  3. 对于时间差大于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]的顺序。

让我们分析两种不同的情况:

  1. 当能力值 k ≥ 3 时:

    这种情况下,我们可以交换任何两个时间差大于1的卡片而不消耗精神力。通过分析可以发现,任何排列都可以通过一系列这样的交换达到有序状态。

    具体来说,我们可以采用类似选择排序的策略:每次找到当前应该在位置i的元素(值为i的元素),将它与位置i的元素交换。由于k≥3,这些交换都是允许的,并且不消耗精神力。

    因此,当k≥3时,答案总是0。

  2. 当能力值 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%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

昨天 12:58
门头沟学院 Java
佬们都a了几道?
投递蚂蚁集团等公司8个岗位 >
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务