OPPO 2024届校招正式批笔试题-研发通用(C卷)

535 阅读3分钟

OPPO 2024届校招正式批笔试题-研发通用(C卷):OPPO杯手机diy大赛、小欧的字符串判定、小欧找数,涉及数学、思维等。

OPPO杯手机diy大赛

问题描述

小欧参加了“oppo杯”手机 diydiy 大赛,该大赛将从外观和性能两个方面综合评比每个选手的作品。

共有 nn 个评委,每个评委为小欧的作品的外观和性能分别打了分数。

为了分数更加有效,每个指标的分数都将分别去除最高分和最低分之后计算剩下分数的平均数即为指标的分数,然后求出这两个指标分数的平均数,即为最终的分数。

然而,突发紧急公告,有一个评委可能由于徇私舞弊失去评价资格。

小欧想知道,如果是第 ii 个评委失去资格,她最终能获得多少分?你需要回答 i=1,2,...,ni=1,2,...,n 的答案。

输入描述

第一行输入一个正整数 nn,代表评委的数量。 接下来的 nn 行,每行输入两个正整数 aia_ibib_i,代表该评委给小欧作品的外观分数和性能分数。

  • 4n1054\leq n \leq 10^5
  • 1ai,bi1091\leq a_i , b_i \leq 10^9

输出描述

输出 nn 行,第 ii 行输出一个浮点数,代表第 ii 个评委失去资格后,小欧最终的分数。

如果你输出的答案精度和标准答案的相对误差不超过 10510^{-5},则认为答案正确。

解题思路

按题意计算即可。

代码实现

typedef long long ll;
const int N = 1e5 + 4, INF = 1e9;
int a[N], b[N];

int main() {

    int n, af[4] = {0, 0, INF, INF}, bf[4] = {0, 0, INF, INF};
    ll as = 0, bs = 0;
    scanf("%d", &n);


    auto comp = [&](int f[], int x) {
        if (x > f[0])f[1] = f[0], f[0] = x;
        else if (x > f[1])f[1] = x;
        if (x < f[2])f[3] = f[2], f[2] = x;
        else if (x < f[3])f[3] = x;
    };
    for (int i = 0; i < n; i++) {
        scanf("%d%d", &a[i], &b[i]);
        comp(af, a[i]), comp(bf, b[i]);
        as += a[i], bs += b[i];
    }
    
    auto cal = [&](const int f[], int x, ll sum) {
        int l = x == f[0] ? 1 : 0;
        int h = x == f[2] ? 3 : 2;
        return 1.0 * (sum - f[l] - f[h] - x) / (n - 3);
    };
    for (int i = 0; i < n; i++) {
        printf("%.6lf\n", (cal(af, a[i], as) + cal(bf, b[i], bs)) / 2);
    }

    return 0;
}

时间复杂度:O(n)O(n)

空间复杂度:O(n)O(n)

小欧的字符串判定

题目描述

小欧拿到了两个字符串 sstt,她有一个目标字符串 targettarget。小欧希望每一位从或 sstt 的对应位置的字符中二选一生成 targettarget,你能告诉小欧她最终能达成目的吗?

输入描述

第一行输入一个正整数 nn,代表 s,t,targets,t,target 的长度。

第二行输入一个字符串 ss

第三行输入一个字符串 tt

第四行输入一个字符串 targettarget

  • 1n1001\leq n \leq 100

输出描述

如果可以达成目的,则输出"Yes"。否则输出"No"

解题思路

按题意计算即可。

代码实现

int main() {
    int n;
    string s, t, tar;
    cin >> n >> s >> t >> tar;
    while (n--) {
        if (s[n] == tar[n] || t[n] == tar[n])continue;
        printf("No");
        return 0;
    }
    printf("Yes");
    return 0;
}

时间复杂度:O(n)O(n)

空间复杂度:O(n)O(n)

小欧找数

题目描述

小欧有 22 个区间 [l1,r1][l_1,r_1][l2,r2][l_2,r_2]。小欧想知道存在多少个整数 midmid,可以找到两个整数 xxyy 满足 mid=(x+y)/2mid=⌊(x+y)/2⌋l1xr1,l2yr2l_1≤x≤r_1, l_2≤y≤r_2

其中 x⌊x⌋ 表示对 xx 下取整。

输入描述

一行四个整数 l1,r1,l2,r2l_1,r_1,l_2,r_2

  • 1l1r110141 \leq l_1 \leq r_1 \leq 10^{14}
  • 1l2r210141 \leq l_2 \leq r_2 \leq 10^{14}

输出描述

一行一个整数,表示满足条件的 midmid 数量。

解题思路

midmid 的最大值为 AA,最小值为 BB,则 midmid 的个数为 BA+1B-A+1

代码实现、

typedef long long ll;
int main() {
    ll a, b, c, d;
    cin >> a >> b >> c >> d;
    cout << (b + d) - (a + c) + 1;
    return 0;
}

时间复杂度:O(1)O(1)

空间复杂度:O(1)O(1)

END

文章文档:公众号 字节幺零二四 回复关键字可获取本文文档。

题目来源:OPPO 2024届校招正式批笔试题-研发通用(C卷)

文章声明:题目来源 牛客 平台,如有侵权,请联系删除!