科大讯飞笔试 科大讯飞秋招 科大讯飞笔试题 0927

笔试时间:2025年9月27日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:小红的红色数组

小红拿到了一个长度为 n 的整数数组(下标从 1 开始)。她将其中 k 个元素染成了红色,染红元素的下标依次为 b₁,b₂,...,bₖ,保证两两不同。

小红想知道:所有未被染成红色的元素之和等于多少?

输入描述

  • 在第一行输入两个整数 n,k(1 ≤ k ≤ n ≤ 2 × 10⁵),分别表示数组长度与被染红的元素个数
  • 在第二行输入 n 个整数 a₁,a₂,...,aₙ(1 ≤ aᵢ ≤ 10⁹),表示数组元素
  • 在第三行输入 k 个互不相同的整数 b₁,b₂,...,bₖ(1 ≤ bᵢ ≤ n),表示被染红元素的下标
  • 输出描述

    输出一个整数,表示所有未被染红元素的和。

    样例输入

    3 1

    1 2 3

    1

    样例输出

    5

    样例说明1

    在此样例中,第1个元素被染红,未染红元素为 a₂ = 2,a₃ = 3,因此答案为 2 + 3 = 5。

    参考题解

    解题思路:

    读取数组后直接计算总和,读取染红元素下标时,直接从总和中减去对应位置的元素值,最终剩下的就是未被染红元素的和。

    C++:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n, k;
        cin >> n >> k;
        
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        
        long long sum = 0;
        for (int i = 0; i < n; i++) {
            sum += a[i];
        }
        
        for (int i = 0; i < k; i++) {
            int index;
            cin >> index;
            sum -= a[index - 1];
        }
        
        cout << sum << endl;
        return 0;
    }
    

    Java:

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int k = sc.nextInt();
            
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }
            
            long sum = 0;
            for (int i = 0; i < n; i++) {
                sum += a[i];
            }
            
            for (int i = 0; i < k; i++) {
                int index = sc.nextInt();
                sum -= a[index - 1];
            }
            
            System.out.println(sum);
            sc.close();
        }
    }
    

    Python:

    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    red_indices = list(map(int, input().split()))
    
    total_sum = sum(a)
    
    for index in red_indices:
        total_sum -= a[index - 1]
    
    print(total_sum)
    

    第二题:举一反三

    老师在黑板上写下了 a + b = c

    考虑未知进制 x(2 ≤ x ≤ 10)。称当且仅当字符串 a,b,c,d,e 中的每个字符在进制 x 下均为合法数字(即每个字符代表的数值严格小于 x)时,进制 x 为一种合法选择。上述等式中的加法均在同一进制 x 下进行。

    请在所有满足 2 ≤ x ≤ 10 的进制中,考虑所有同时满足「为合法选择」且「有 a + b = c 成立」的进制 x;对每个此类进制 x,将 d 与 e 分别按进制 x 解释为十进制整数并在十进制下求和;若所有此类进制得到的和完全相同,则输出该相同的值,否则输出baka。

    输入描述

    每个测试文件均包含多组测试数据。第一行输入一个整数 t (1 ≤ t ≤ 2 × 10⁵),表示测试数据组数;

    此后 t 行,每行依次输入五个字符串 a,b,c,d,e,它们分别表示在同一未知进制 x 下的五个非负整数。字符串仅包含 '0' ~ '9'。

    输出描述

    对于每组测试数据,新起一行输出如下结果:

    • 若不存在任何同时满足「为合法选择」且「有 a + b = c 成立」的进制 x,输出 baka;
    • 否则,若对所有此类进制 x 所计算得到的 d + e 的十进制值完全相同,则输出该相同的值;
    • 否则,输出 baka。

    样例输入

    2

    10 10 20 11 0

    1 1 2 2 2

    样例输出

    baka

    4

    样例说明

    • 第一组中,字符串"10"、"10"和"20"在任意进制 x(x > 3) 下都满足 A + B = C,但此时 D + E 在不同进制下分别为 x + 1,结果不唯一,故输出 "baka";
    • 第二组中,"1"+"1"="2"在任意进制 x(x ≥ 3) 下皆成立,且 "2"+"2"对应十进制值恒等于 4,结果唯一,故输出"4"。

    参考题解

    解题思路:

    枚举每一种进制,然后逐位进行计算判断a+b是否等于c,如果等于将其放入到验证数组中,如果验证数组为空,输出baka。否则枚举验证数组中的每一种进制,计算d+e看其结果是否相同。

    C++:

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    
    ll calc(const string& s, int y) {
        ll x = 0;
        for (char c : s) x = x * y + (c - '0');
        return x;
    }
    
    int main() {
        ios::sync_with_stdio(0);
        cin.tie(0);
        
        int t;
        cin >> t;
        
        while (t--) {
            string a, b, c, d, e;
            cin >> a >> b >> c >> d >> e;
            
            string ss = a + b + c + d + e;
            int up = 0;
            for (char ch : ss) up = max(up, ch - '0');
            
            set<ll> st;
            for (int x = max(2, up + 1); x <= 10; x++) {
                if (calc(a, x) + calc(b, x) == calc(c, x)) {
                    st.insert(calc(d, x) + calc(e, x));
                }
            }
            
            if (st.size() != 1) cout << "baka\n";
            else cout << *st.begin() << "\n";
        }
        
        return 0;
    }
    

    Java:

    import java.util.*;
    import java.io.*;
    
    public class Main {
        static long calc(String s, int base) {
            long x = 0;
            for (char c : s.toCharArray()) {
                x = x * base + (c - '0');
            }
            return x;
        }
        
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int t = sc.nextInt();
    

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

    2025 春招笔试合集 文章被收录于专栏

    2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

    全部评论

    相关推荐

    评论
    1
    收藏
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务