【科大讯飞笔试题汇总】2024-07-20-科大讯飞秋招提前批(算法岗)-三语言题解(Cpp/Java/Python)

news2024/9/22 1:23:22

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

✨ 本系列打算持续跟新 秋招笔试题
👏 感谢大家的订阅➕ 和 喜欢💗

📧 清隆这边最近正在收集近一年半互联网笔试题汇总,有需要的小伙伴可以关注 文末 公主号领取~

文章目录

    • 🧷 01.LYA的珠宝展示顺序
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例说明
      • 数据范围
      • 题解
      • 参考代码
    • 🍿 02.LYA的字符串魔法
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 🍡 03.K小姐的幸运数字
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例说明
      • 数据范围
      • 题解
      • 参考代码
  • 写在最后
    • 🎧 秋招陪伴刷题打卡
    • ✈️ 超全的笔试题汇总

🧷 01.LYA的珠宝展示顺序

问题描述

LYA是一位珠宝设计师,她正在准备一场珠宝展。她有一系列独特的珠宝作品,每件都有其独特的价值。为了让展览更有趣,LYA决定按照特殊的顺序展示她的作品。她想按照以下规则来决定展示顺序:

  1. 首先选择价值居中的作品(如果作品数量为奇数)或两个中间价值的作品中较小的一个(如果作品数量为偶数)。
  2. 展示选中的作品,并将其从列表中移除。
  3. 重复步骤1和2,直到所有作品都被展示。

LYA想知道按照这个规则,她的珠宝作品会以什么顺序被展示。

输入格式

第一行包含一个正整数 n n n 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105),表示珠宝作品的数量。
第二行包含 n n n 个正整数 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109),表示每件珠宝作品的价值。

输出格式

输出一行,包含 n n n 个整数,表示珠宝作品展示的顺序。

样例输入

4
1 9 8 5

样例输出

5 8 1 9

样例说明

首先选择5(两个中间值中较小的一个),然后是8,接着是1,最后是9。

数据范围

1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105
1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

题解

找规律+模拟。

  1. 首先对输入的价值序列进行排序。
  2. 使用两个指针,一个指向序列中间(偶数长度时指向中间偏左),另一个指向中间偏右。
  3. 交替输出左指针和右指针指向的元素,并向两端移动指针。

这种方法能够保证每次都选择当前剩余元素中的中位数或两个中间值中较小的一个。

时间复杂度:排序需要 O ( n log ⁡ n ) O(n\log n) O(nlogn),输出需要 O ( n ) O(n) O(n),总体时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)
空间复杂度: O ( n ) O(n) O(n),用于存储排序后的序列。

参考代码

  • Python
n = int(input())
a = list(map(int, input().split()))
a.sort()
l, r = (n-1)//2, n//2
result = []
while l >= 0 and r < n:
    if l == r:
        result.append(a[l])
    else:
        result.extend([a[l], a[r]])
    l -= 1
    r += 1
print(*result)
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        Arrays.sort(a);
        int l = (n - 1) / 2, r = n / 2;
        while (l >= 0 && r < n) {
            if (l == r) {
                System.out.print(a[l] + " ");
            } else {
                System.out.print(a[l] + " " + a[r] + " ");
            }
            l--;
            r++;
        }
    }
}
  • Cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    int l = (n - 1) / 2, r = n / 2;
    while (l >= 0 && r < n) {
        if (l == r) {
            cout << a[l] << " ";
        } else {
            cout << a[l] << " " << a[r] << " ";
        }
        l--, r++;
    }
    return 0;
}

🍿 02.LYA的字符串魔法

问题描述

LYA 是一位热爱魔法的少女。最近,她发现了一种神奇的字符串魔法。这种魔法可以从一个由小写字母组成的字符串中提取出各种子序列,并计算这些子序列中不同字符的总数。

给定一个长度为 n n n 的小写字母字符串 s s s,LYA 想知道所有非空子序列中不同字符的个数总和是多少。由于这个数字可能非常大,LYA 只需要知道这个总和对 1 0 9 + 7 10^9+7 109+7 取模后的结果。

你能帮助 LYA 完成这个魔法计算吗?

输入格式

输入一行,包含一个仅由小写字母组成的字符串 s s s

输出格式

输出一个整数,表示所有非空子序列中不同字符的个数总和对 1 0 9 + 7 10^9+7 109+7 取模后的结果。

样例输入

aaaa

样例输出

15

样例输入

abcde

样例输出

80

数据范围

1 ≤ ∣ s ∣ ≤ 1 0 5 1 \leq |s| \leq 10^5 1s105

题解

这道题目的关键在于理解子序列的性质和不同字符的计数方法。

  1. 对于字符串中的每个字符,我们需要考虑它在多少个子序列中出现。

  2. 假设字符 c c c 在原字符串中出现了 k k k 次,那么包含至少一个 c c c 的子序列数量为 2 k − 1 2^k - 1 2k1(选择或不选择每个 c c c,减去全不选的情况)。

  3. 对于不包含 c c c 的其他位置,有 2 n − k 2^{n-k} 2nk 种选择方式。

  4. 因此,字符 c c c 对最终结果的贡献为 ( 2 k − 1 ) × 2 n − k (2^k - 1) \times 2^{n-k} (2k1)×2nk

  5. 我们需要对字符串中的每个不同字符重复这个计算过程,并将结果相加。

  6. 最后,将总和对 1 0 9 + 7 10^9+7 109+7 取模即可得到最终答案。

这种方法的时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是字符串的长度。我们只需要遍历一次字符串来统计每个字符的出现次数,然后对每个不同的字符进行一次计算。

参考代码

  • Python
from collections import Counter

def solve():
    s = input()
    ans = 0
    n = len(s)
    mod = 10**9 + 7
    cnt = Counter(s)
    for c in set(s):
        ans += (pow(2, cnt[c], mod) - 1) * pow(2, n - cnt[c], mod) % mod
        ans %= mod
    print(ans)

if __name__ == '__main__':
    solve()
  • Java
import java.util.*;

public class Main {
    static final int MOD = 1000000007;

    static long fastPow(long base, int exp) {
        long result = 1;
        while (exp > 0) {
            if ((exp & 1) == 1) {
                result = result * base % MOD;
            }
            base = base * base % MOD;
            exp >>= 1;
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int n = s.length();
        long ans = 0;
        int[] cnt = new int[26];
        
        for (char c : s.toCharArray()) {
            cnt[c - 'a']++;
        }
        
        for (int i = 0; i < 26; i++) {
            if (cnt[i] > 0) {
                ans += (fastPow(2, cnt[i]) - 1) * fastPow(2, n - cnt[i]) % MOD;
                ans %= MOD;
            }
        }
        
        System.out.println(ans);
    }
}	
  • Cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;

const int MOD = 1e9 + 7;

long long fastPow(long long base, int exp) {
    long long result = 1;
    while (exp > 0) {
        if (exp & 1) {
            result = result * base % MOD;
        }
        base = base * base % MOD;
        exp >>= 1;
    }
    return result;
}

int main() {
    string s;
    cin >> s;
    int n = s.length();
    vector<int> cnt(26, 0);
    long long ans = 0;
    
    for (char c : s) {
        cnt[c - 'a']++;
    }
    
    for (int i = 0; i < 26; i++) {
        if (cnt[i] > 0) {
            ans += (fastPow(2, cnt[i]) - 1) * fastPow(2, n - cnt[i]) % MOD;
            ans %= MOD;
        }
    }
    
    cout << ans << endl;
    return 0;
}

🍡 03.K小姐的幸运数字

问题描述

K小姐是一位数学爱好者,她相信每个人都有自己的幸运数字。最近她发现,任何一个正整数 n n n 都可以表示成若干个不同的 2 2 2 的次幂与 3 3 3 的次幂之和的形式,即:

n = 2 a 1 × 3 b 1 + 2 a 2 × 3 b 2 + ⋯ + 2 a m × 3 b m n = 2^{a_1} \times 3^{b_1} + 2^{a_2} \times 3^{b_2} + \cdots + 2^{a_m} \times 3^{b_m} n=2a1×3b1+2a2×3b2++2am×3bm

其中 1 ≤ a 1 < a 2 < ⋯ < a m 1 \leq a_1 < a_2 < \cdots < a_m 1a1<a2<<am, 0 ≤ b 1 ≤ b 2 ≤ ⋯ ≤ b m 0 \leq b_1 \leq b_2 \leq \cdots \leq b_m 0b1b2bm

其中需要满足 2 a i 3 b i ≠ 2 a j 3 b j 2^{a_i}3^{b_i} \neq 2 ^ {a_j}3^{b_j} 2ai3bi=2aj3bj

现在,K小姐希望你能帮她找到给定正整数 n n n 的这样一个表示法,并将其中的 m m m 个不同的整数 { 2 a 1 3 b 1 , 2 a 2 3 b 2 , ⋯   , 2 a m 3 b m } \{2^{a_1}3^{b_1}, 2^{a_2}3^{b_2}, \cdots, 2^{a_m}3^{b_m}\} {2a13b1,2a23b2,,2am3bm} 从大到小依次输出。

输入格式

第一行包含一个正整数 T T T,表示测试数据的组数。

接下来 T T T 行,每行包含一个正整数 n n n ( 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1n109),表示给定的初始数字。

输出格式

对于每组测试数据,第一行输出一个正整数 m m m ( 1 ≤ m ≤ 100 1 \leq m \leq 100 1m100),表示 2 2 2 的次幂项的个数。

第二行按照从大到小的顺序输出 m m m 个不同的整数 { 2 a 1 3 b 1 , 2 a 2 3 b 2 , ⋯   , 2 a m 3 b m } \{2^{a_1}3^{b_1}, 2^{a_2}3^{b_2}, \cdots, 2^{a_m}3^{b_m}\} {2a13b1,2a23b2,,2am3bm},相邻两项之间用一个空格隔开。

如果存在多种合法的表示法,你可以输出任意一种。

样例输入

7
5
10 
15
123
33
321

样例输出

2
8 2
2
12 3
3
96 24 3
3
24 6 3
4
288 24 6 3

样例说明

10 = 2 3 × 3 0 + 2 1 × 3 0 10 = 2 ^ 3 \times 3 ^ 0 + 2 ^ 1 \times 3 ^ 0 10=23×30+21×30

15 = 2 2 × 3 1 + 2 0 × 3 1 15 = 2 ^ 2 \times 3 ^ 1 + 2 ^ 0 \times 3 ^ 1 15=22×31+20×31

123 = 2 5 × 3 1 + 2 3 × 3 1 + 2 0 × 3 1 123 = 2 ^ 5 \times 3 ^ 1 + 2 ^ 3 \times 3 ^ 1 + 2 ^ 0 \times 3 ^ 1 123=25×31+23×31+20×31

33 = 2 3 × 3 1 + 2 1 × 3 1 + 2 0 × 3 1 33 = 2 ^ 3 \times 3 ^ 1 + 2 ^ 1 \times 3 ^ 1 + 2 ^ 0 \times 3 ^ 1 33=23×31+21×31+20×31

321 = 2 5 × 3 2 + 2 3 × 3 1 + 2 1 × 3 1 + 2 0 × 3 1 321 = 2 ^ 5 \times 3 ^ 2 + 2 ^ 3 \times 3 ^ 1 + 2 ^ 1 \times 3 ^ 1+ 2 ^ 0 \times 3 ^ 1 321=25×32+23×31+21×31+20×31

数据范围

  • 1 ≤ T ≤ 100 1 \leq T \leq 100 1T100
  • 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1n109

题解

这题可以直接取巧,我们可以发现,要找到给定正整数 n n n 2 2 2 的次幂与 3 3 3 的次幂之和表示,实际上可以直接将 n n n 进行二进制拆分。因为 2 2 2 的次幂就对应二进制中的 1 1 1,而 3 3 3 的次幂我们可以先不管。

这样做的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn),空间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

参考代码

  • Python
T = int(input())
for _ in range(T):
    n = int(input())
    v = []
    for i in range(32):
        if (n >> i) & 1:
            v.append(1 << i)
    m = len(v)
    print(m)
    print(*v[::-1])
  • Java
import java.util.*;

public class Main {
    public static void solve(Scanner sc) {
        int n = sc.nextInt();
        List<Integer> v = new ArrayList<>();
        for (int i = 0; i < 32; i++) {
            if ((n >> i & 1) == 1) {
                v.add(1 << i);
            }
        }
        int m = v.size();
        System.out.println(m);
        for (int i = m - 1; i >= 0; i--) {
            System.out.print(v.get(i));
            if (i > 0) {
                System.out.print(" ");
            }
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while (T-- > 0) {
            solve(sc);
        }
    }
}
  • Cpp
#include <iostream>
#include <vector>
using namespace std;

void solve() {
    int n;
    cin >> n;
    vector<int> v;
    for (int i = 0; i < 32; i++) {
        if (n >> i & 1) {
            v.push_back(1 << i);
        }
    }
    int m = v.size();
    cout << m << endl;
    for (int i = m - 1; i >= 0; i--) {
        cout << v[i];
        if (i > 0) {
            cout << " ";
        }
    }
    cout << endl;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

写在最后

这边给大家推荐一下 学长的秋招陪伴打卡小屋啦,31天 带你一步一步解决常见互联网笔试题型,每天都是干货满满哦。

🎧 秋招陪伴刷题打卡

  • 试读:

【秋招刷题打卡】Day01-自定义排序-CSDN博客

【秋招刷题打卡】Day02-最强二分系列之-二分查找-CSDN博客

【秋招刷题打卡】Day03-最强二分系列之-二分答案-CSDN博客

提供往期大厂真题在线评测,感兴趣的小伙伴可以私信清隆详细了解哦

在这里插入图片描述

在这里插入图片描述

还有! 还有!还有!

✈️ 超全的笔试题汇总

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1938899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java+springboot+vue实现的企业OA管理系统(文末源码+Lw)131

基于SpringBootVue的实现的企业OA管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 企业OA管理系统有管理员和用户。 管理员功能有个人中心&#xff0c;用户管理&#xff0c;公告信息管理&#xff0c;客户关系管理&…

【nnUNet V2系列】nnUNet V2在Ubuntu下安装调试篇

安装之前网上很多教程&#xff0c;很多是nnUNet V1的安装过程&#xff0c;有的V1和V2混在一起讲解&#xff0c;导致V1的转化指令用到V2中&#xff0c;产生不少误解。这篇是针对V2整理出来的安装过程&#xff0c;有什么不妥之处请指出会及时修改。 1. 创建虚拟环境 conda crea…

某4G区域终端有时驻留弱信号小区分析

这些区域其实是长时间处于连接态的电信卡4G终端更容易出现。 出现问题时都是band1 100频点下发了针对弱信号的1650频点的连接态A4测量事件配置&#xff08;其阈值为-106&#xff09;。而这个条件很容易满足&#xff0c;一旦下发就会切到band3 1650频点。 而1650频点虽然下发ban…

Visual Studio 2022美化

说明&#xff1a; VS版本&#xff1a;Visual Studio Community 2022 背景美化 【扩展】【管理扩展】搜索“ClaudiaIDE”&#xff0c;【下载】&#xff0c;安装完扩展要重启VS 在wallhaven下载壁纸图片作为文本编辑器区域背景图片 【工具】【选项】搜索ClaudiaIDE&#xff…

手机数据恢复技巧:适用于 Android 的恢复应用程序

发现自己意外删除了 Android 设备上的照片&#xff0c;这让人很痛苦。这些照片可能是值得纪念的文件&#xff0c;会让您想起一些难忘的回忆。删除它们后&#xff0c;您知道如何恢复它们。在这种情况下&#xff0c;您需要使用 Android 的照片恢复应用程序。 无论您需要直接从 A…

git跨库合并

1、背景 A为开发环境的代码仓库&#xff0c;B为生产环境的代码仓库。A和B之间不能通信。开发人员的本地电脑可以和A、B通信。 目的 上线时&#xff0c;需要将A代码合并B代码。 2、实现 2.1 添加远程仓库 2.1.1 代码方式 在B代码仓库中,将A添加为远程仓库。 git remote …

腾讯会议产品策划的成长之路:从万字文档到功能落地的实战经验

腾讯会议产品策划的成长之路&#xff1a;从万字文档到功能落地的实战经验 在腾讯会议的产品团队中&#xff0c;有这样一位产品策划&#xff0c;他以其出色的逻辑思维、全局观念以及扎实的执行力&#xff0c;在团队中发挥着举足轻重的作用。他就是林陪同&#xff0c;一个自称“会…

抽奖算法的设计与实现

更多内容欢迎访问我的个人博客网站&#xff1a;www.zpf0000.com 在数据库中准备好以下数据表 lottery表 sql代码解读复制代码 DROP TABLE IF EXISTS lottery; CREATE TABLE lottery (id int NOT NULL AUTO_INCREMENT,user_id int NOT NULL DEFAULT 0 COMMENT 发起抽奖用户ID,n…

【MySQL】:对库和表的基本操作方法

数据库使用的介绍 什么是SQL 学习数据库的使用——>基于 SQL编程语言 来对数据库进行操作 重点表述的是“需求”&#xff0c;期望得到什么结果。&#xff08;至于结果是如何得到的&#xff0c;并不关键&#xff0c;都是数据库服务器在背后做好了&#xff09; 重点表述的是…

DEGAS:将临床属性转移到细胞

DEGAS&#xff08;单细胞诊断证据量表&#xff0c;Diagnostic Evidence GAuge of Single cells&#xff09;是一种迁移学习框架&#xff0c;用于将疾病信息从患者转移到细胞。作者将这种可转移信息称为“印象-impressions”&#xff0c;它允许单细胞与疾病属性相关联&#xff0…

【Python】使用库 -- 详解

库就是别人已经写好了的代码&#xff0c;可以让我们直接拿来用。 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习&#xff0c;一方面取决于生态是否完备。所谓的 “生态” 指的就是语言是否有足够丰富的库&#xff0c;来应对各种各样的场景。在…

动态路由协议 —— EIGRP 与 OSPF 的区别

EIGRP&#xff08;增强内部网关路由协议&#xff09;和 OSPF&#xff08;开放式最短路径优先&#xff09;是两种最常见的动态路由协议&#xff0c;主要是用来指定路由器或交换机之间如何通信。将其应用于不同的情况下&#xff0c;可提高速率、延迟等方面的性能。那么它们之间到…

【Python系列】Python 缓存机制

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【排序数组】python刷题记录

润到排序算法了。 顺便复习一下排序算法 easy work class Solution:def sortArray(self, nums: List[int]) -> List[int]:nums.sort()return nums 11种排序算法 # 选择排序 def selectsort(s):for i in range(0,len(s)-1):curmininfcuridx-1for j in range(i,len(s)):if …

【运维】软件运维方案(2024word完整版)

1. 文档介绍 2. 人员与责任 3. 运维过程内容 4. 运维资源 5. 运维服务规划保障 6. 事件处置 7. 质量改进 8. 运维边界及内容 获取方式&#xff1a; 本文末个人名片直接获取。

Leetcode1688. 比赛中的配对次数

问题描述&#xff1a; 给你一个整数 n &#xff0c;表示比赛中的队伍数。比赛遵循一种独特的赛制&#xff1a; 如果当前队伍数是 偶数 &#xff0c;那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛&#xff0c;且产生 n / 2 支队伍进入下一轮。如果当前队伍数为 奇…

【计算机视觉】siamfc论文复现实现目标追踪

什么是目标跟踪 使用视频序列第一帧的图像(包括bounding box的位置)&#xff0c;来找出目标出现在后序帧位置的一种方法。 什么是孪生网络结构 孪生网络结构其思想是将一个训练样本(已知类别)和一个测试样本(未知类别)输入到两个CNN(这两个CNN往往是权值共享的)中&#xff0…

【SRC】小程序抓包巨详细配置,一个Burp就够了,但是可以更优雅!

小程序抓包配置 文章目录 小程序抓包配置0x00 前言0x01 直接使用BurpSuite抓包0x02 配合Proxifier 0x00 前言 其实在PC端抓微信小程序的包&#xff0c;只需要一个BurpSuite就足够了&#xff0c;但是为了避免抓一些没用的包&#xff0c;减少对小程序抓包测试过程中的干扰&#…

学生处分类型管理

在智慧校园学工管理系统中&#xff0c;"处分类型"功能扮演着至关重要的角色&#xff0c;它如同一座桥梁&#xff0c;连接着校园秩序与学生行为规范的两端。这一模块的核心精髓&#xff0c;在于它以精准的违规行为界定和适当的处分措施&#xff0c;巧妙地平衡了纪律的…

Qmi8658a姿态传感器使用心得(4)linux

1.FIFO 结构与大小 FIFO 数据可以包含陀螺仪和加速度计数据&#xff0c;通过 SPI/I2C/I3C 接口以突发读模式读取。FIFO 大小可配置为 16 样本、32 样本、64 样本或 128 样本&#xff08;每个样本为 6 字节&#xff09;。 2.FIFO 模式 Bypass 模式&#xff1a;禁用 FIFO 功能。…