oppo笔试 oppo笔试题 0426
笔试时间:2025年04月26日
历史笔试传送门:
第一题
题目:op 串问题
小欧有一个仅由 'o'、'p' 组成的字符串,要删除 2 个 'o' 和 2 个 'p',求字典序最小的字符串。字典序比较规则为:a 是 b 的前缀且 a≠b ;或 a 与 b 第一个不同位置处,a 的字母在字母表中位置前于 b 相应字母。
输入描述
一行输入长度为 | s|(5 ≤ |s| ≤ 10⁵)的仅由 'o'、'p' 组成的字符串 s,且字符串中 'o'、'p' 各有两个以上。
输出描述
输出一行,为字典序最小的答案字符串。
样例输入
oppoop
样例输出
op
解释:一种删除方法是删除前四个字母,可证明 “op” 在所有删除方法中字典序最小。
参考题解
该问题的目标是删除字符串中的 2 个 'o' 和 2 个 'p',并返回字典序最小的字符串。 处理过程中,我们需要维护栈,以便在遇到不合适的字符时能够进行删除。 最终结果是要输出删除后的最小字典序字符串。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
if (!(cin >> s)) return 0;
int n = s.size();
int tot_o = 0, tot_p = 0;
for (char c : s) {
if (c == 'o') ++tot_o;
elseif (c == 'p') ++tot_p;
}
int rem_del_o = 2, rem_del_p = 2;
int keep_o = tot_o - rem_del_o;
int keep_p = tot_p - rem_del_p;
int rem_o = tot_o, rem_p = tot_p;
string st;
st.reserve(n);
int cnt_o = 0, cnt_p = 0;
for (char c : s) {
if (c == 'o') --rem_o;
else --rem_p;
while (!st.empty()) {
char top = st.back();
if (top > c) {
if (top == 'o') {
if (rem_del_o > 0 && (cnt_o - 1 + rem_o) >= keep_o) {
st.pop_back();
--cnt_o;
--rem_del_o;
continue;
}
} else {
if (rem_del_p > 0 && (cnt_p - 1 + rem_p) >= keep_p) {
st.pop_back();
--cnt_p;
--rem_del_p;
continue;
}
}
}
break;
}
if (c == 'o') {
if (cnt_o < keep_o) {
st.push_back('o');
++cnt_o;
} else {
--rem_del_o;
}
} else {
if (cnt_p < keep_p) {
st.push_back('p');
++cnt_p;
} else {
--rem_del_p;
}
}
}
cout << st << "\n";
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int n = s.length();
int tot_o = 0, tot_p = 0;
for (char c : s.toCharArray()) {
if (c == 'o') tot_o++;
else if (c == 'p') tot_p++;
}
int rem_del_o = 2, rem_del_p = 2;
int keep_o = tot_o - rem_del_o;
int keep_p = tot_p - rem_del_p;
int rem_o = tot_o, rem_p = tot_p;
Stack<Character> stack = new Stack<>();
int cnt_o = 0, cnt_p = 0;
for (char c : s.toCharArray()) {
if (c == 'o') rem_o--;
else rem_p--;
while (!stack.isEmpty()) {
char top = stack.peek();
if (top > c) {
if (top == 'o') {
if (rem_del_o > 0 && (cnt_o - 1 + rem_o) >= keep_o) {
stack.pop();
cnt_o--;
rem_del_o--;
continue;
}
} else {
if (rem_del_p > 0 && (cnt_p - 1 + rem_p) >= keep_p) {
stack.pop();
cnt_p--;
rem_del_p--;
continue;
}
}
}
break;
}
if (c == 'o') {
if (cnt_o < keep_o) {
stack.push('o');
cnt_o++;
} else {
rem_del_o--;
}
} else {
if (cnt_p < keep_p) {
stack.push('p');
cnt_p++;
} else {
rem_del_p--;
}
}
}
StringBuilder result = new StringBuilder();
for (char c : stack) {
result.append(c);
}
System.out.println(result);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
s = input().strip()
n = len(s)
tot_o = s.count('o')
tot_p = s.count('p')
rem_del_o = 2
rem_del_p = 2
keep_o = tot_o - rem_del_o
keep_p = tot_p - rem_del_p
rem_o = tot_o
rem_p = tot_p
st = []
cnt_o = 0
cnt_p = 0
for c in s:
if c == 'o':
rem_o -= 1
else:
rem_p -= 1
while st:
top = st[-1]
if top > c:
if top == 'o':
if rem_del_o > 0 and (cnt_o - 1 + rem_o) >= keep_o:
st.pop()
cnt_o -= 1
rem_del_o -= 1
continue
else:
if rem_del_p > 0 and (cnt_p - 1 + rem_p) >= keep_p:
st.pop()
cnt_p -= 1
rem_del_p -= 1
continue
break
if c == 'o':
if cnt_o < keep_o:
st.append('o')
cnt_o += 1
else:
rem_del_o -= 1
else:
if cnt_p < keep_p:
st.append('p')
cnt_p += 1
else:
rem_del_p -= 1
print(''.join(st))
第二题
题目
小欧和小皮正在摘苹果,小欧在地面,小皮在苹果树上,小欧、小皮、苹果可以视为一个二维平面。小欧初始时在(t, 0)位置,她每个单位时间可以向左或向右移动1个单位长度,即移动到(t - 1, 0)或(t + 1, 0)位置,当然,她也可以不移动。摘苹果时,小皮会在开始的时候剪断苹果在的树枝,剪断树枝后苹果就会开始下落,下落速度会越来越快: 第一个单位时间下落1个单位长度; 第二个单位时间下落2个单位长度; … 第i个单位时间下落i个单位长度,以此类推。例如苹果初始时位置在(x, y),那么第一个单位时间后苹果在(x, y - 1)的位置,第二个单位时间后苹果在(x, y - 3)的位置上,……。若苹果落地之后(即y值小于等于0的时刻)直至该单位时间结束,小欧都不在(x, 0)位置上,则这个苹果就坏掉了。对于每颗苹果,小欧想知道她是否可以在苹果坏掉前拿到这颗苹果(若苹果和小欧同时到达(x, 0)位置,视为小欧可以拿到这棵苹果)。在本题中,假设时间是非连续的,单位时间是最小的单位,只需要在每一个单位时间末判断,而不需要考虑单位时间内发生的问题。
输入描述
第一行中输入一个整数q (1 ≤ q ≤ 10⁵),表示询问次数,对于每个询问: 在一行输入三个整数x, y, t (-10⁹ ≤ x, t ≤ 10⁹; 1 ≤ y ≤ 10⁹) 代表苹果和小欧的位置。
输出描述
对于每个询问,若小欧可以拿到苹果,在一行上输出YES,否则,直接输出NO。
样例输入
4
1 3 0
2 3 0
3 5 0
1 2 -2
样例输出
YES
YES
YES
NO
解释:
小欧路径 (0, 0) → (1, 0) → (1, 0)
苹果
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南