【秋招笔试】2025.08.02OPPO秋招笔试改编题
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线100+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
题目一:小兰的魔法宝石收集
1️⃣:遍历数组,找出编号为
的倍数的宝石
2️⃣:计算这些宝石的魔法值总和,判断是否能被
整除
难度:简单
这道题目考查基本的遍历和取模运算。关键在于理解编号从 开始,需要正确判断哪些位置的元素需要累加。通过一次遍历即可解决,时间复杂度为
。
题目二:小毛的团队资源分配
1️⃣:理解问题本质,将
转化为
2️⃣:对员工能力值进行排序
3️⃣:选择最大的
个作为第一组,最小的
个作为第三组
难度:中等
这道题目的关键在于数学推导和贪心策略。通过分析绝对值表达式的性质,发现最优解就是让能力最强和最弱的员工分别组队,从而最大化差值。
题目三:小柯的数据异常检测
1️⃣:利用前缀和的奇偶性来判断子数组和的奇偶性
2️⃣:预处理每个位置的奇数/偶数前缀数量
3️⃣:通过计算区间内奇数前缀和偶数前缀的乘积得到答案
难度:中等偏难
这道题目需要深入理解前缀和与子数组和的关系,以及奇偶性的数学性质。通过巧妙的预处理,将每次查询的时间复杂度降至 ,体现了算法优化的重要性。
01. 小兰的魔法宝石收集
问题描述
小兰在一个神秘的洞穴中发现了 颗魔法宝石,每颗宝石都有不同的魔法值。这些宝石按照发现的顺序排列成一行,编号为
到
。
根据古老的传说,只有当收集到的宝石编号是 的倍数时,这些宝石才会释放出强大的魔法能量。小兰想要知道,如果她收集所有编号为
的倍数的宝石,这些宝石的总魔法值是否能够被
整除。如果能被
整除,说明这些宝石之间存在神奇的共鸣,可以发挥出更强大的力量。
输入格式
第一行包含一个正整数 (
),表示宝石的总数量。
第二行包含 个正整数
(
),表示每颗宝石的魔法值。
输出格式
如果编号为 的倍数的宝石的总魔法值能被
整除,输出
Yes;否则输出 No。
样例输入
6
1 2 3 4 5 6
样例输出
Yes
| 样例 | 解释说明 |
|---|---|
| 样例1 | 编号为 Yes |
数据范围
题解
这道题的核心思路很直接:找出所有编号为 的倍数的宝石,计算它们的魔法值总和,然后判断这个总和是否能被
整除。
关键观察:我们只需要遍历一遍数组,当遍历到第 个宝石时(
从
开始计数),如果
能被
整除,就将该宝石的魔法值加到总和中。最后用取模运算判断总和是否能被
整除。
算法步骤:
- 初始化总和
sum = 0 - 遍历数组,对于第
个宝石(
从
开始):
- 如果
,则
sum += a[i]
- 如果
- 判断
sum % 3是否等于
时间复杂度:,只需要遍历一遍数组。 空间复杂度:
,只需要常数级别的额外空间。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
n = int(input())
gems = list(map(int, input().split()))
# 计算编号为3的倍数的宝石魔法值总和
total = 0
for i in range(n):
if (i + 1) % 3 == 0: # i+1是宝石的编号(从1开始)
total += gems[i]
# 判断总和是否能被3整除
if total % 3 == 0:
print("Yes")
else:
print("No")
if __name__ == "__main__":
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
int sum = 0; // 存储编号为3倍数的宝石魔法值总和
for (int i = 1; i <= n; i++) {
int val;
cin >> val;
if (i % 3 == 0) { // 如果编号是3的倍数
sum += val;
}
}
// 判断总和是否能被3整除
cout << (sum % 3 == 0 ? "Yes" : "No") << 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 sum = 0; // 存储编号为3倍数的宝石魔法值总和
for (int i = 1; i <= n; i++) {
int gemVal = sc.nextInt();
if (i % 3 == 0) { // 如果编号是3的倍数
sum += gemVal;
}
}
// 判断总和是否能被3整除
if (sum % 3 == 0) {
System.out.println("Yes");
} else {
System.out.println("No");
}
sc.close();
}
}
02. 小毛的团队资源分配
问题描述
小毛是一家科技公司的项目经理,他手下有 名员工,每名员工都有不同的工作能力值。现在公司要启动一个重要项目,需要将这些员工平均分成三个小组来负责不同的模块开发。
为了保证项目的成功,小毛希望各个小组之间的能力差距尽可能大,这样可以让每个小组都有明确的定位和专业方向。具体来说,如果将三个小组的总能力值分别记为 、
、
,小毛希望最大化表达式
的值。
请你帮小毛计算出这个表达式的最大可能值。
输入格式
第一行包含一个正整数 (
),表示员工的总数。题目保证
是
的倍数。
第二行包含 个正整数
(
),表示每名员工的工作能力值。
输出格式
输出一个整数,表示 的最大可能值。
样例输入
3
1 2 3
样例输出
3
| 样例 | 解释说明 |
|---|---|
| 样例1 | 三个员工能力值为 |
数据范围
是
的倍数
题解
这道题的关键在于理解如何最大化 这个表达式。
不妨设 ,那么原表达式就变成了
。
要让 最大,显然应该让
尽可能大,
尽可能小。由于每组的人数必须相等(都是
人),最优策略就是:
- 第一组选择能力值最大的
个员工
- 第三组选择能力值最小的
个员工
- 第二组选择剩余的
个员工
这样安排能够保证 达到最大值,
达到最小值,从而使
最大。
算法步骤:
- 对所有员工的能力值进行排序
- 计算前
个最小值的和作为
- 计算后
个最大值的和作为
- 返回
时间复杂度:,主要消耗在排序上。 空间复杂度:
,只需要常数级别的额外空间。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
n = int(input())
vals = list(map(int, input().split()))
# 对能力值进行排序
vals.sort()
k = n // 3
# 计算最小的k个值的和
min_sum = sum(vals[:k])
# 计算最大的k个值的和
max_sum = sum(vals[-k:])
# 返回最大差值
print(max_sum - min_sum)
if __name__ == "__main__":
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<ll> vals(n);
for (int i = 0; i < n; i++) {
cin >> vals[i];
}
// 对能力值进行排序
sort(vals.begin(), vals
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力


查看5道真题和解析