大厂真题:【模拟】OPPO2023秋招提前批-小欧数组求和

2023-10-15 11:52

本文主要是介绍大厂真题:【模拟】OPPO2023秋招提前批-小欧数组求和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述与示例

题目描述

小欧拿到了一个数组,她有q次操作,每次操作修改一个元素。小欧希望每次修改后得到当前数组所有元素之和。你能帮帮她吗?

输入描述

第一行输入两个正整数nq,代表数组的大小和操作次数。

第二行输入n个正整数ai,代表小欧拿到的初始数组。

接下来的q行,每行输入两个正整数ix,代表将第i个元素修改为x

输出描述

输出q行,每行输出一个正整数,代表当前数组元素之和。

示例

输入

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

输出

16
16
12

说明

第一次修改后,数组变成[1,3,3,4,5],元素之和为16

第二次修改后,数组变成[1,3,3,4,5],元素之和为16

第三次修改后,数组变成[1,3,3,4,1],元素之和为12

解题思路

本题属于非常简单的模拟题。

对于某一次特定的修改,假设我们已知上一次修改后的数组和nums_sum,而本次修改将nums[i]修改为x,那么修改后的和应该为nums_sum-nums[i]+x。而此处修改后的和又可以作为下一次修改的上一次修改后的数组和来使用,即存在

nums_sum = nums_sum - nums[i] + x

需要被在本次修改后输出。同时nums[i]需要修改为x。上述核心代码为

nums_sum -= nums[i]
nums_sum += x
nums[i] = x

本题要特别注意,题目最后q行输入的索引值是从1开始的,故映射到数组的索引值,必须进行i -= 1的修改。

代码

Python

# 题目:【模拟】OPPO2023秋招提前批-小欧数组求和
# 作者:闭着眼睛学数理化
# 算法:模拟
# 代码有看不懂的地方请直接在群上提问# 数组长度n,操作次数q
n, q = map(int, input().split())
# 初始数组nums
nums = list(map(int, input().split()))
# 计算初始数组nums的和
nums_sum = sum(nums)
# 储存q次修改的结果
ans = list()# 循环q次,修改q次
for _ in range(q):# 修改的位置i和修改的内容xi, x = map(int, input().split())# 注意i输入表示的是第i个元素,将其改为索引需要-1i -= 1# 将nums[i]修改为x,则整体的和需要减少nums[i],增加xnums_sum -= nums[i]nums_sum += x# 同时nums[i]被修改为xnums[i] = x# 将本次修改后的数组和nums_sum储存在ans中,方便后续按顺序输出ans.append(nums_sum)for num in ans:print(num)

Java

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int q = scanner.nextInt();int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = scanner.nextInt();}int numsSum = 0;for (int num : nums) {numsSum += num;}int[] ans = new int[q];for (int k = 0; k < q; k++) {int i = scanner.nextInt() - 1;int x = scanner.nextInt();numsSum -= nums[i];numsSum += x;nums[i] = x;ans[k] = numsSum;}for (int num : ans) {System.out.println(num);}}
}

C++

#include <iostream>
using namespace std;int main() {int n, q;cin >> n >> q;int nums[n];for (int i = 0; i < n; i++) {cin >> nums[i];}int numsSum = 0;for (int i = 0; i < n; i++) {numsSum += nums[i];}int ans[q];for (int k = 0; k < q; k++) {int i, x;cin >> i >> x;i--;numsSum -= nums[i];numsSum += x;nums[i] = x;ans[k] = numsSum;}for (int i = 0; i < q; i++) {cout << ans[i] << endl;}return 0;
}

时空复杂度

时间复杂度:O(N+q)。第一次计算nums的和的时间复杂度为O(N),进行q次修改的时间复杂度为O(q)

空间复杂度:O(1)。仅需若干常数变量。

华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 OD算法冲刺训练课程表 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

这篇关于大厂真题:【模拟】OPPO2023秋招提前批-小欧数组求和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/217536

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数