秋招突围】2024届秋招-OPPO笔试题-第一套

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

✨ 本系列打算持续跟新 OPPO 春秋招笔试题 汇总`

📝 今天 OPPO2025届秋招 也是正式拉开帷幕啦

👏 感谢大家的订阅➕ 和 喜欢💗

✨ 笔试合集传送们 -> 🧷春秋招笔试合集

alt

🎀 01.K小姐的快速库存管理系统

问题描述

K小姐经营着一家小商店,最近她想开发一个快速库存管理系统。商店中有 种商品,每种商品的初始数量记录在数组 中。

接下来的 天中,每天都会有一些商品的数量发生变化。第 天会有一条形如 的操作,表示将第 种商品的数量变为

为了实时监控库存状况,K小姐希望在每次操作后快速得到当前所有商品数量的总和。你能帮助她完成这个库存管理系统吗?

输入格式

第一行包含两个正整数 ,表示商品种类数和操作天数。

第二行包含 个正整数,第 个数表示初始时第 种商品的数量

接下来 行,每行包含两个正整数 ,表示第 种商品的数量变为

输出格式

输出共 行,每行一个整数,表示每次操作后所有商品数量的总和。

样例输入

5 4
1 2 3 4 5
1 2
3 2
4 2
5 2

样例输出

16
15
13
10

数据范围

题解

本题可以使用前缀和的思想来解决。我们可以先预处理出初始时所有商品数量的总和 ,然后在每次操作时,先将 减去被修改商品的原数量,再加上修改后的数量,即可得到操作后的商品总数量。

具体步骤如下:

  1. 读入商品种类数 和操作天数

  2. 读入初始商品数量数组 ,并计算初始商品总数量

  3. 对于每次操作 :

    • 减去第 种商品的原数量
    • 将第 种商品的数量修改为 ,即
    • 加上修改后的数量
    • 输出当前的商品总数量

时间复杂度为 ,空间复杂度为

参考代码

  • Python
n, k = map(int, input().split())
a = list(map(int, input().split()))
sum = 0
for i in range(n):
    sum += a[i]

for i in range(k):
    u, v = map(int, input().split())
    u -= 1
    sum -= a[u]
    a[u] = v
    sum += a[u]
    print(sum)
  • 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();
        long[] a = new long[n];
        long sum = 0;
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextLong();
            sum += a[i];
        }
        
        for (int i = 0; i < k; i++) {
            int u = sc.nextInt() - 1;
            long v = sc.nextLong();
            sum -= a[u];
            a[u] = v;
            sum += a[u];
            System.out.println(sum);
        }
    }
}
  • Cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, k;
    cin >> n >> k;
    vector<long long> a(n);
    long long sum = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        sum += a[i];
    }
    
    for (int i = 0; i < k; i++) {
        int u;
        long long v;
        cin >> u >> v;
        u--;
        sum -= a[u];
        a[u] = v;
        sum += a[u];
        cout << sum << "\n";
    }
    return 0;
}

📝 02.LYA的圆形喷水器

问题描述

LYA在他的花园中安装了一个矩形喷水器,喷水器的边分别与花园的长和宽平行。为了确保花园的每个角落都能被浇灌到,LYA决定在花园中的某个位置 安装一个圆形喷水器,使其能够完全覆盖矩形喷水器所在的区域。

给定矩形喷水器的对角线坐标 ,以及圆形喷水器的安装位置 ,请你计算圆形喷水器的最小面积。

输入格式

第一行包含四个实数 ,分别表示矩形喷水器对角线上两个点的坐标。

第二行包含两个实数 ,表示圆形喷水器的安装位置坐标。

输入坐标的绝对值均小于

输出格式

输出一个实数 ,表示覆盖矩形喷水器所需的最小圆形喷水器面积。如果答案的绝对或相对误差不超过 ,则视为正确。

样例输入

1 1 2 2
0 0

样例输出

25.1327412287

数据范围

输入坐标的绝对值均小于

题解

本题可以通过以下步骤求解:

  1. 根据矩形喷水器的对角线坐标 ,计算出矩形喷水器的另外两个顶点坐标
  2. 计算圆形喷水器中心点 到矩形喷水器四个顶点的距离,取其中的最大值作为圆形喷水器的半径
  3. 根据公式 计算圆形喷水器的面积。

时间复杂度为 ,空间复杂度为

参考代码

  • Python
from math import pi

x1, y1, x2, y2 = map(float, input().split())
x, y = map(float, input().split())

x3, y3 = x1, y2
x4, y4 = x2, y1

r = max(
    (x1 - x) ** 2 + (y1 - y) ** 2,
    (x2 - x) ** 2 + (y2 - y) ** 2,
    (x3 - x) ** 2 + (y3 - y) ** 2,
    (x4 - x) ** 2 + (y4 - y) ** 2
) ** 0.5

area = pi * r ** 2
print(f"{area:.10f}")
  • Java
import java.util.Scanner;

publi

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

学长刷题笔记 文章被收录于专栏

这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的

全部评论
考虑我司么,https://www.nowcoder.com/share/jump/1722072069170
点赞 回复 分享
发布于 07-27 17:21 上海

相关推荐

不愿透露姓名的神秘牛友
10-21 23:16
已编辑
德赛西威 算法 N×(13-15) 其他
点赞 评论 收藏
分享
5 12 评论
分享
牛客网
牛客企业服务