【秋招突围】2024届秋招笔试-OPPO笔试题-第一套-三语言题解(Java/Cpp/Python)

news2024/9/22 9:50:47

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

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

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

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

alt

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

问题描述

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

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

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

输入格式

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

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

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

输出格式

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

样例输入

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

样例输出

16
15
13
10

数据范围

  • 3 ≤ n ≤ 1 0 6 3 \leq n \leq 10^6 3n106
  • 1 ≤ k ≤ 1 0 6 1 \leq k \leq 10^6 1k106
  • 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109
  • 1 ≤ u ≤ n 1 \leq u \leq n 1un
  • 1 ≤ v ≤ 1 0 9 1 \leq v \leq 10^9 1v109

题解

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

具体步骤如下:

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

  2. 读入初始商品数量数组 a a a,并计算初始商品总数量 s u m sum sum

  3. 对于每次操作 ( u , v ) (u, v) (u,v):

    • s u m sum sum 减去第 u u u 种商品的原数量 a [ u ] a[u] a[u]
    • 将第 u u u 种商品的数量修改为 v v v,即 a [ u ] = v a[u] = v a[u]=v
    • s u m sum sum 加上修改后的数量 a [ u ] a[u] a[u]
    • 输出当前的商品总数量 s u m sum sum

时间复杂度为 O ( n + k ) O(n + k) O(n+k),空间复杂度为 O ( n ) O(n) O(n)

参考代码

  • 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决定在花园中的某个位置 P ( x , y ) P(x, y) P(x,y) 安装一个圆形喷水器,使其能够完全覆盖矩形喷水器所在的区域。

给定矩形喷水器的对角线坐标 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2),以及圆形喷水器的安装位置 P ( x , y ) P(x, y) P(x,y),请你计算圆形喷水器的最小面积。

输入格式

第一行包含四个实数 x 1 x_1 x1 y 1 y_1 y1 x 2 x_2 x2 y 2 y_2 y2,分别表示矩形喷水器对角线上两个点的坐标。

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

输入坐标的绝对值均小于 1 0 5 10^5 105

输出格式

输出一个实数 S S S,表示覆盖矩形喷水器所需的最小圆形喷水器面积。如果答案的绝对或相对误差不超过 1 0 − 6 10^{-6} 106,则视为正确。

样例输入

1 1 2 2
0 0

样例输出

25.1327412287

数据范围

输入坐标的绝对值均小于 1 0 5 10^5 105

题解

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

  1. 根据矩形喷水器的对角线坐标 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2),计算出矩形喷水器的另外两个顶点坐标 ( x 3 , y 3 ) (x_3, y_3) (x3,y3) ( x 4 , y 4 ) (x_4, y_4) (x4,y4)
  2. 计算圆形喷水器中心点 P ( x , y ) P(x, y) P(x,y) 到矩形喷水器四个顶点的距离,取其中的最大值作为圆形喷水器的半径 r r r
  3. 根据公式 S = π r 2 S = \pi r^2 S=πr2 计算圆形喷水器的面积。

时间复杂度为 O ( 1 ) O(1) O(1),空间复杂度为 O ( 1 ) O(1) O(1)

参考代码

  • 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;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double x1 = sc.nextDouble(), y1 = sc.nextDouble();
        double x2 = sc.nextDouble(), y2 = sc.nextDouble();
        double x = sc.nextDouble(), y = sc.nextDouble();

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

        double r = Math.max(
            Math.max(Math.pow(x1 - x, 2) + Math.pow(y1 - y, 2),
                     Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2)),
            Math.max(Math.pow(x3 - x, 2) + Math.pow(y3 - y, 2),
                     Math.pow(x4 - x, 2) + Math.pow(y4 - y, 2))
        );

        double area = Math.PI * r;
        System.out.printf("%.10f", area);
    }
}
  • Cpp
#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

int main() {
    double x1, y1, x2, y2, x, y;
    cin >> x1 >> y1 >> x2 >> y2 >> x >> y;

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

    double r = max(
        max(pow(x1 - x, 2) + pow(y1 - y, 2),
            pow(x2 - x, 2) + pow(y2 - y, 2)),
        max(pow(x3 - x, 2) + pow(y3 - y, 2),
            pow(x4 - x, 2) + pow(y4 - y, 2))
    );

    double area = M_PI * r;
    printf("%.10f\n", area);

    return 0;
}

💡 03.最短K0子串

问题描述

LYA是一名软件工程师,她正在研究一种特殊的字符串,称为K0串。一个字符串如果它的所有字符的ASCII码值乘积转换为二进制后,末尾至少有 k k k 个连续的0,则称该字符串为K0串。

现在给定一个长度为 n n n 的字符串 s s s,请你帮助LYA找出 s s s 的所有子串中,最短的K0子串的长度。

输入格式

第一行包含两个正整数 n n n k k k,分别表示字符串 s s s 的长度和要求的末尾连续0的个数。

第二行包含一个长度为 n n n 的字符串 s s s

输出格式

输出一个整数,表示最短K0子串的长度。如果不存在K0子串,则输出 − 1 -1 1

样例输入

7 3
abcdefg

样例输出

3

数据范围

3 ≤ n ≤ 1 0 5 3 \leq n \leq 10^5 3n105
1 ≤ k ≤ 1 0 5 1 \leq k \leq 10^5 1k105
字符串 s s s 仅包含小写字母。

题解

本题可以使用双指针+前缀和的思想来解决。我们可以用一个数组 c o u n t count count 来维护以每个字符结尾的子串中,二进制末尾连续0的个数。

具体地,我们从左到右遍历字符串 s s s,对于每个位置 i i i,我们计算以 s [ i ] s[i] s[i] 结尾的子串的 c o u n t count count 值,即 c o u n t [ i ] = c o u n t [ i − 1 ] + t r a i l i n g _ z e r o s ( s [ i ] ) count[i] = count[i-1] + trailing\_zeros(s[i]) count[i]=count[i1]+trailing_zeros(s[i]),其中 t r a i l i n g _ z e r o s ( x ) trailing\_zeros(x) trailing_zeros(x) 表示 x x x 的二进制表示中末尾连续0的个数。

然后我们使用双指针 l e f t left left r i g h t right right 来枚举所有的子串。初始时 l e f t = r i g h t = 0 left=right=0 left=right=0,我们不断地右移 r i g h t right right,并更新 c o u n t [ r i g h t ] count[right] count[right] 的值。当 c o u n t [ r i g h t ] − c o u n t [ l e f t − 1 ] ≥ k count[right]-count[left-1] \geq k count[right]count[left1]k 时,说明子串 s [ l e f t , r i g h t ] s[left,right] s[left,right] 是一个K0串,我们更新答案,并右移 l e f t left left,直到上述不等式不成立。然后继续右移 r i g h t right right,直到遍历完整个字符串。

最后,如果没有找到K0子串,则输出 − 1 -1 1,否则输出最短K0子串的长度。

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

参考代码

  • Python
n, k = map(int, input().split())
s = input()

def trailing_zeros(x):
    cnt = 0
    while x > 0 and (x & 1) == 0:
        cnt += 1
        x >>= 1
    return cnt

count = [0] * (n + 1)
for i in range(1, n + 1):
    count[i] = count[i - 1] + trailing_zeros(ord(s[i - 1]))

left = right = 0
min_len = float('inf')
while right < n:
    while right < n and count[right + 1] - count[left] < k:
        right += 1
    if right == n or count[right + 1] - count[left] >= k:
        min_len = min(min_len, right - left + 1)
    left += 1

print(min_len if min_len != float('inf') else -1)
  • 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();
        String s = sc.next();

        int[] count = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            count[i] = count[i - 1] + trailingZeros(s.charAt(i - 1));
        }

        int left = 0, right = 0;
        int minLen = Integer.MAX_VALUE;
        while (right < n) {
            while (right < n && count[right + 1] - count[left] < k) {
                right++;
            }
            if (count[right + 1] - count[left] >= k) {
                minLen = Math.min(minLen, right - left + 1);
            }
            left++;
        }

        System.out.println(minLen == Integer.MAX_VALUE ? -1 : minLen);
    }

    private static int trailingZeros(char c) {
        int x = (int) c;
        int cnt = 0;
        while (x > 0 && (x & 1) == 0) {
            cnt++;
            x >>= 1;
        }
        return cnt;
    }
}
  • Cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int trailingZeros(char c) {
    int x = (int) c;
    int cnt = 0;
    while (x > 0 && (x & 1) == 0) {
        cnt++;
        x >>= 1;
    }
    return cnt;
}

int main() {
    int n, k;
    string s;
    cin >> n >> k >> s;

    vector<int> count(n + 1);
    for (int i = 1; i <= n; i++) {
        count[i] = count[i - 1] + trailingZeros(s[i - 1]);
    }

    int left = 0, right = 0;
    int minLen = INT_MAX;
    while (right < n) {
        while (right < n && count[right + 1] - count[left] < k) {
            right++;
        }
        if (count[right + 1] - count[left] >= k) {
            minLen = min(minLen, right - left + 1);
        }
        left++;
    }

    cout << (minLen == INT_MAX ? -1 : minLen) << endl;

    return 0;
}

alt

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

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

相关文章

R安装Matrix的版本问题

今天遇到一个奇怪的问题 Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck vI[[j]]) :载入了名字空间‘Matrix’ 1.4-1&#xff0c;但需要的是> 1.6.0其实我一直没搞明白&#xff0c;Matrix是cran上面的包嘛 为什么Rstudio上面又不现实呢&…

STL常用容器-stack栈容器queue队容器

stack栈的基本概念 stack是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;它只有一个出口&#xff1b; 只允许在栈顶新增元素、删除元素、获取栈顶元素&#xff0c;但是除了栈顶之外&#xff0c;其他位置都不能存取元素&#xff0c;只有栈顶元素能被外界访问&am…

题解 - 中位数

题目描述 数学中&#xff0c;我们经常这么来定义中位数&#xff1a;有 n 个数&#xff0c;从小到大排序以后&#xff0c;排名中间的数就是中位数&#xff0c;当 n 是奇数的时候&#xff0c;中位数只有 1 个&#xff0c;当 n 是偶数的时候&#xff0c;中间两个数都是中位数。注…

【Rhino】【Python】按指定距离数列,复制和堆叠对象

Rhino Python脚本&#xff1a;按指定高度复制和堆叠对象 在建筑设计和3D建模中&#xff0c;我们经常需要创建具有不同高度的多层结构。本文将介绍一个Rhino Python脚本&#xff0c;该脚本可以根据指定的高度列表&#xff0c;自动复制和堆叠选定的对象。这个脚本特别适用于快速…

RocketMQ消息发送基本示例(推送消费者)

消息生产者通过三种方式发送消息 1.同步发送:等待消息返回后再继续进行下面的操作 同步发送保证了消息的可靠性&#xff0c;适用于关键业务场景。 2.异步发送:不等待消息返回直接进入后续流程.broker将结果返回后调用callback函数,并使用 CountDownLatch计数 3.单向发送:只…

【过题记录】7.31(树形dp,根号分治)

先补一下昨天没来得及写的题目 延时操控 分析&#xff1a; 由于是延时操控 所以敌人的前面几步跟我们走的是一样的 所不一样的是我们比敌人多走了k步 所以我们可以先让我们和敌人同步行走&#xff0c;最后让我们随机游走k步即可。 由于这里n和m的范围都很小&#xff0c;所以我…

力扣 位运算

位运算基础的异或运算&#xff0c;线性时间复杂度和常数空间复杂度。 题目 class Solution {public int singleNumber(int[] nums) {int ans 0;for (int i: nums) {ans ^ i;}return ans;} }

Linux下用户组练习

目录 建立用户组 shengcan&#xff0c;其id 为 2000 建立用户组 caiwu&#xff0c;其id为 2001 建立用户组 jishu&#xff0c;其id 为 2002 建立用户lee&#xff0c;指定其主组id为shengchan&#xff0c;附加组为jishu和 caiwu&#xff0c;确保 lee 用户的uid 和 gid 保持一…

C++客户端Qt开发——界面优化(绘图)

2.绘图 Qt提供了画图相关的APL&#xff0c;可以允许我们在窗口上绘制任意的图形形状&#xff0c;来完成更复杂的界面设计 所谓的"控件"&#xff0c;本质上也是通过画图的方式画上去的 画图AP|和控件之间的关系&#xff0c;可以类比成机器指令和高级语言之间的关系…

大模型“挣钱”新方法!用GPT-4优化众筹文稿,提高筹款成功率11.9%!

怎么才能在大模型时代&#xff0c;更好地通过大模型&#xff08;LLM&#xff09;来挣钱&#xff1f;写软文拿打赏&#xff0c;画海报给甲方&#xff0c;或者制作视频来打造个人IP&#xff1f;不够&#xff0c;还想要更直接一点的方式&#xff1f;那有没有一种可能&#xff0c;直…

密码学基础-为什么使用真随机数(True Random Number Generators)

密码学基础-为什么使用真随机数&#xff08;True Random Number Generators&#xff09; 概述 随机的意义很重要&#xff0c;就像你的银行密码如果是亲朋好友的生日&#xff0c;结婚纪念日&#xff08;可预测的&#xff09;&#xff0c;那么就容易被人测试出来&#xff1b;而…

Centos 7配置问题

在VMWare12上面安装Centos 7 Linux虚拟机&#xff0c;在切换到命令界面时&#xff0c;需要登录用户名和密码&#xff0c;但发现输入用户后有字符显示&#xff0c;但是密码没有。 经过一系列查看后&#xff0c;发现这个是Linux的一种机制&#xff0c;即当你输入密码时不显示&…

Python批量移除Word文档水印

Word文档被广泛用于各种正式与非正式的沟通场合。有时候这些文档中可能包含着不再需要的水印&#xff0c;比如早期的草稿标记、保密声明或是仅供预览的信息等。这些水印的存在可能会干扰文档的阅读体验&#xff0c;甚至在某些情况下导致信息传达的不准确或产生误解。移除Word文…

QT:多版本同时使用(5.15.2在线安装教程)

前言 根据不同项目的需要有时候不得不安装多个版本的QT&#xff0c;新版本的QT都需要在线安装&#xff0c;以下为QT5.15.2的在线安装办法&#xff08;5.15.2为LTS版本相对更稳定&#xff09;&#xff0c;老版本可参考之前的离线安装&#xff0c; 版本选择 比如 5.15.2 是完整的…

昇思25天学习打卡营第XX天|Diffusion扩散模型

扩散模型自DDPM论文提出后&#xff0c;在图像生成领域取得了显著进展&#xff0c;特别是在文本条件图像生成方面。重要发展包括改进的去噪模型&#xff0c;级联扩散模型以提高图像分辨率&#xff0c;以及无需分类器的扩散模型指导。DALL-E 2和ImageGen等模型展示了结合语言模型…

7.29 Day11 LVM逻辑卷管理

LVM逻辑卷管理&#xff1a; 优点&#xff1a;将多个磁盘进行统一管理&#xff0c;易于扩容 缺点&#xff1a;不支持容错&#xff08;任意一个磁盘坏了&#xff0c;整个磁盘都会坏&#xff09; 实现步骤&#xff1a; 对磁盘进行分区--改为8e--PV&#xff08;物理卷&#xff0…

pythonGame-实现羊了个羊简易字母版

通过python简单复现羊了个羊游戏。 使用到的库函数&#xff1a; import pygame import random 游戏源码&#xff1a; import pygame import random# 初始化pygame pygame.init()# 设置窗口大小 WIDTH 800 HEIGHT 600 screen pygame.display.set_mode((WIDTH, HEIGHT)) p…

基于N32L406MB EasyFlash参数(key-value)记录库移植

EasyFlash 感谢作者的分享https://github.com/armink/EasyFlash EasyFlash是一款开源的轻量级嵌入式Flash存储器库&#xff0c;方便开发者更加轻松的实现基于Flash存储器的常见应用开发 三大实用功能 ENV快速保存产品参数(key-value)&#xff0c;支持 写平衡&#xff08;磨…

文心智能体零代码开发实践,创建一个智能体:从理论到实践AI技术落地

文心智能体引领零代码智能体开发新风尚&#xff0c;诚邀您一同探索这前沿科技的魅力&#xff01;以下为实践创建一个叫”从理论到实践AI技术落地“智能体的步骤。 首先登录官网&#xff1a;文心智能体平台AgentBuilder | 想象即现实 登录后点击&#xff1a;创建智能体 输入“…

《660》+《880》强化带刷计划‼️45天吃透所有核心知识点

如果把660吃透再去做880&#xff0c;肯定会轻松一些&#xff01; 因为660题对于基础的考查很深入&#xff0c;每一道题都有难度&#xff0c;都需要认真思考才能做出来&#xff0c;所以&#xff0c;660建议在基础结束之后再开始做&#xff0c;因为基础阶段本身对基础知识的理解…