oppo笔试 oppo笔试题 0426

笔试时间:2025年04月26日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目: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 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务