【春招笔试】2025.03.15-电信笔试题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题(建议用时:90分钟/套)
  • 对照解析查漏补缺
  • 配套练习题库

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

春秋招合集 -> 互联网必备刷题宝典🔗

2025.03.15-电信题目集合

题目一:音乐节奏优化器

1️⃣:音符序列构建与表示 2️⃣:优先队列(最小堆)应用 3️⃣:贪心策略优化音符持续时间

整体难度:中等

该题目要求通过有限次操作,使所有音符中持续时间最短的那个音符尽可能长。每次操作可以选择一个音符,将其持续时间延长10个单位。关键是将输入字符串转换为音符序列,然后使用优先队列(最小堆)来高效地找到持续时间最短的音符。每次从优先队列中取出持续时间最短的音符,增加其持续时间后再放回队列,重复操作k次。时间复杂度为O(n + k log n),其中n是音符的数量,k是操作次数。

题目二:情绪识别器

1️⃣:表情符号识别与统计 2️⃣:字符串模式匹配 3️⃣:情感倾向判断逻辑

整体难度:简单

该题目要求统计字符串中两种表情符号(":-)"和":-(")的数量,并根据它们的数量关系判断文本的情感倾向。通过遍历字符串,识别并统计这两种表情符号的出现次数,然后根据统计结果判断情感倾向:高兴表情多则输出"Happy",难过表情多则输出"Sad",数量相等且至少各有一个则输出"Just so so",没有表情则输出"None"。时间复杂度为O(n),其中n是字符串的长度。

题目三:商场折扣计算器

1️⃣:阶梯式折扣规则应用 2️⃣:条件判断与优惠选择 3️⃣:精确小数计算与格式化

整体难度:简单

该题目要求根据给定的购物金额,计算应用最优惠折扣后的最终支付金额。根据不同的金额阈值(100元、500元、2000元、5000元),分别应用不同的折扣率(9折、8折、7折、6折)。关键是正确判断适用的折扣等级,计算折扣后的金额,并将结果保留一位小数输出。由于只需要进行简单的条件判断和计算,时间复杂度为O(1)。

01. 音乐节奏优化器

问题描述

小基是一位音乐爱好者,她喜欢用字母表示不同的音调: 表示 la, 表示 xi, 表示 do, 表示 re, 表示 mi, 表示 fa, 表示 sol。当一个音调需要延长时间时,小基会使用多个相同的字母来表示该音的持续时间。例如, 表示共有 个音符,分别是:一个持续时间为 的 do,一个持续时间为 的 la,一个持续时间为 的 xi,以及一个持续时间为 的 do。

现在,小基有 次操作机会,每次操作可以选择一个音符,将其持续时间延长 个单位。小基希望通过这些操作,使得最终所有音符中持续时间最短的那个音符尽可能长。

你需要帮助小基设计一个操作方案,并输出最终每个音符的持续时间。

输入格式

第一行输入一个字符串,长度不超过 ,表示小基的音乐序列。字符串仅包含 这七种大写字母。

第二行输入一个正整数 ,表示小基可以进行的操作次数。

输出格式

首先输出 行,每行包含一个正整数 和一个字符 ,表示小基对第 个音符进行操作,该音符的音调为

最后输出一个字符串,格式为 ,表示最终操作后,每个音符及其持续时间。

如果有多种不同的操作方案,输出任意一种即可。但需要保证最终音符持续时间的最小值是尽可能大的。

样例输入

CCABCC
3

样例输出

2 A
3 B
2 A
C(2)A(21)B(11)C(2)

样例解释

共操作3次。 对第2个音符A操作1次,持续时间变成11。 对第3个音符B操作1次,持续时间变成11。 对第2个音符A再操作1次,持续时间变成21。 操作结束后,音符持续时间的最小值为2。可以证明,这个最小值是尽可能大的。

数据范围

  • 字符串长度不超过
  • 字符串仅包含 这七种大写字母

题解

这道题目要求我们通过有限次操作,使得所有音符中持续时间最短的那个音符尽可能长。

解题思路:

  1. 首先,我们需要将输入的字符串转换为音符序列,每个音符包含其音调和持续时间。例如,将"CCABCC"转换为[(C,2), (A,1), (B,1), (C,2)]。
  2. 然后,我们需要进行k次操作,每次操作选择持续时间最短的音符,将其持续时间增加10。
  3. 如果有多个音符的持续时间相同且最短,我们可以任选其中一个进行操作。

为了高效地找到持续时间最短的音符,我们可以使用优先队列(最小堆)。每次从优先队列中取出持续时间最短的音符,增加其持续时间后再放回队列。

时间复杂度:,其中n是音符的数量,k是操作次数。我们需要O(n)的时间来构建音符序列,然后进行k次操作,每次操作需要O(log n)的时间来维护优先队列。 空间复杂度:,需要存储音符序列和优先队列。

参考代码

Python

import sys
import heapq
input = lambda:sys.stdin.readline().strip()

def optimize_music():
    # 读取输入
    music = input()
    k = int(input())
    
    # 构建音符序列
    notes = []
    i = 0
    note_id = 1
    
    while i < len(music):
        # 找到连续相同的字符
        j = i
        while j < len(music) and music[j] == music[i]:
            j += 1
        
        # 添加音符(持续时间, 音调, 编号)
        duration = j - i
        note = (duration, music[i], note_id)
        notes.append(note)
        note_id += 1
        i = j
    
    # 创建最小堆,按持续时间排序
    heap = [(duration, tone, idx) for duration, tone, idx in notes]
    heapq.heapify(heap)
    
    # 记录每个音符的最终持续时间
    final_durations = {idx: duration for duration, _, idx in notes}
    final_tones = {idx: tone for _, tone, idx in notes}
    
    # 执行k次操作
    operations = []
    for _ in range(k):
        # 取出持续时间最短的音符
        duration, tone, idx = heapq.heappop(heap)
        
        # 记录操作
        operations.append((idx, tone))
        
        # 增加持续时间并放回堆
        new_duration = duration + 10
        final_durations[idx] = new_duration
        heapq.heappush(heap, (new_duration, tone, idx))
    
    # 输出操作序列
    for idx, tone in operations:
        print(f"{idx} {tone}")
    
    # 输出最终结果
    result = ""
    for idx in range(1, note_id):
        result += f"{final_tones[idx]}({final_durations[idx]})"
    
    print(result)

if __name__ == "__main__":
    optimize_music()

C++

#include <bits/stdc++.h>
using namespace std;

// 自定义比较函数,按持续时间升序排序
struct CompareNotes {
    bool operator()(const tuple<int, char, int>& a, const tuple<int, char, int>& b) {
        // 如果持续时间不同,按持续时间排序
        if (get<0>(a) != get<0>(b)) {
            return get<0>(a) > get<0>(b);
        }
        // 如果持续时间相同,按编号排序
        return get<2>(a) > get<2>(b);
    }
};

void solve() {
    string music;
    int k;
    cin >> music >> k;
    
    // 构建音符序列
    vector<tuple<int, char, int>> notes;
    int i = 0, note_id = 1;
    
    while (i < music.size()) {
        // 找到连续相同的字符
        int j = i;
        while (j < music.size() && music[j] == music[i]) {
            j++;
        }
        
        // 添加音符(持续时间, 音调, 编号)
        int duration = j - i;
        notes.emplace_back(duration, music[i], note_id++);
        i = j;
    }
    
    // 创建最小堆
    priority_queue<tuple<int, char, int>, vector<tuple<int, char, int>>, CompareNotes> pq;
    for (const auto& note : notes) {
        pq.push(note);
    }
    
    // 记录每个音符的最终持续时间和音调
    unordered_map<int, int> final_durations;
    unordered_map<int, char> final_tones;
    
    for (const auto& [duration, tone, idx] : notes) {
        final_durations[idx] = duration;
        final_tones[idx] = tone;
    }
    
    // 执行k次操作
    for (int i = 0; i < k; i++) {
        // 取出持续时间最短的音符
        auto [duration, tone, idx] = pq.top();
        pq.pop();
        
        // 输出操作
        cout << idx << " " << tone << endl;
        
        // 增加持续时间并放回堆
        duration += 10;
        final_durations[idx] = duration;
        pq.push(make_tuple(duration, tone, idx));
    }
    
    // 输出最终结果
    string result = "";
    for (int idx = 1; idx < note_id; idx++) {
        result += final_tones[idx] + string("(") + to_string(final_durations[idx]) + string(")");
    }
    
    cout << result << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 0;
}

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String music = sc.nextLine();
        int k = sc.nextInt();
        
        // 构建音符序列
        List<Note> notes = new ArrayList<>();
        int i = 0, noteId = 1;
        
 

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

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

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

全部评论

相关推荐

评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务