拼多多笔试真题 2026-8-30【唯一入栈出库序列】

唯一入栈出库序列(C++/Py/Java /Js/Go)题解

拼多多 8月30号 笔试真题 第二题

拼多多真题目录点击查看: 拼多多 春招&秋招 笔试真题题库目录|笔试题库 + 算法考点详解

题目内容

中转仓今晚只有一条暂存滑轨,滑轨按栈工作:后进的货先出。值班员必须按货号从小到大出库,并记下唯一的入轨、出库动作;若做不到就在日志里写失败标记。

共有 k k k 件货按到达顺序经过主道,第 i i i 件的货号是 v i v_i vi。 v v v 是 1 ∼ k 1 \sim k 1∼k 的一个排列。出库顺序必须恰好是 1 , 2 , ... , k 1,2,\dots,k 1,2,...,k。

每件货到达时,值班员必须立刻做下面两种动作之一:

  • I:把它推进暂存栈;
  • 若规则允许,之后用 O 弹出栈顶出库。
    任意时刻只要栈顶正好是下一个该出的货号,就必须立刻 O 出库。可以证明:能成功时,动作序列是唯一的。
    请判断能否按号出完。能则输出由 IO 组成的动作串(恰好 k k k 个 I 和 k k k 个 O);不能则输出 N
    货件数满足 1 ≤ k ≤ 1 \le k \le 1≤k≤ 200000

输入描述

第一行一个正整数 k k k( 1 ≤ k ≤ 1 \le k \le 1≤k≤ 200000),表示货件数。

第二行 k k k 个正整数 v 1 , v 2 , ... , v k v_1,v_2,\dots,v_k v1,v2,...,vk,保证是 1 ∼ k 1 \sim k 1∼k 的排列。

输出描述

若存在合法方案,输出一行由 IO 组成的字符串;否则输出一行一个字符 N

样例1

输入

复制代码
4
3 1 2 4

输出

复制代码
IIOIOOIO

说明

31 入栈后弹出 1,再让 2 入栈并连续弹出 23,最后 4 入栈再出库。

样例2

输入

复制代码
3
2 3 1

输出

复制代码
N

说明

23 入栈后,1 再入再出,栈顶变成 3,下一个该出的是 2,卡死。

样例3

输入

复制代码
1
1

输出

复制代码
IO

说明

只有一件货,入栈后立刻出库。

题解

思路

解题算法:

  1. 记录当前需要弹出的数index,使用栈保存压入的数,ans记录处理序列
  2. 循环接受输入的数,并压入栈中,同时添加I操作,如果当前栈顶元素 == index,迭代弹出栈顶元素,并添加O操作。
  3. 处理完所有输入数之后,如果栈非空说明无合法序列输出N.否则输出对应ans序列即可。
  4. 算法总体时间复杂度为O(k)

C++

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main() {
    int k;
    string ans;
    int index = 1;
    stack<int> stk;
    cin >> k;
    for (int i = 0; i < k; i++) {
        int x;
        cin >> x;
        stk.push(x);
        ans.push_back('I');
        while (!stk.empty() && stk.top() == index) {
            ans.push_back('O');
            stk.pop();
            index++;
        } 
    }
    if (!stk.empty()) {
        cout << "N";
        return 0;
    }
    cout << ans;
    return 0;
}

java

java 复制代码
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);

        int k = sc.nextInt();
        StringBuilder ans = new StringBuilder();
        int index = 1;
        Stack<Integer> stk = new Stack<>();

        for (int i = 0; i < k; i++) {
            int x = sc.nextInt();
            stk.push(x);
            ans.append('I');

            while (!stk.empty() && stk.peek() == index) {
                ans.append('O');
                stk.pop();
                index++;
            }
        }

        if (!stk.empty()) {
            System.out.print("N");
            return;
        }

        System.out.print(ans);
    }
}

python

python 复制代码
k = int(input())
data = list(map(int, input().split()))
ans = []
index = 1
stk = []

for i in range(k):
    x = data[i]
    stk.append(x)
    ans.append('I')

    while stk and stk[-1] == index:
        ans.append('O')
        stk.pop()
        index += 1

if stk:
    print("N")
else:
    print(''.join(ans))

javascript

js 复制代码
const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const input = [];

rl.on('line', line => {
    input.push(...line.trim().split(/\s+/));
});

rl.on('close', () => {
    let pos = 0;
    const k = Number(input[pos++]);

    let ans = [];
    let index = 1;
    const stk = [];

    for (let i = 0; i < k; i++) {
        const x = Number(input[pos++]);
        stk.push(x);
        ans.push('I');

        while (stk.length > 0 && stk[stk.length - 1] === index) {
            ans.push('O');
            stk.pop();
            index++;
        }
    }

    if (stk.length > 0) {
        console.log('N');
        return;
    }

    console.log(ans.join(''));
});

Go

go 复制代码
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	in := bufio.NewReader(os.Stdin)

	var k int
	fmt.Fscan(in, &k)

	ans := ""
	index := 1
	stk := []int{}

	for i := 0; i < k; i++ {
		var x int
		fmt.Fscan(in, &x)

		stk = append(stk, x)
		ans += "I"

		for len(stk) > 0 && stk[len(stk)-1] == index {
			ans += "O"
			stk = stk[:len(stk)-1]
			index++
		}
	}

	if len(stk) > 0 {
		fmt.Println("N")
		return
	}

	fmt.Println(ans)
}
相关推荐
lvwangshu17 分钟前
分治:序列分治(CDQ)与点分治
算法·分治
无限码力22 分钟前
2026-8-30拼多多笔试真题-哪个查阅窗能留空(C++/Py/Java /Js/Go)
算法·pdd·pdd笔试真题·拼多多春招笔试真题·拼多多秋招笔试真题·拼多多笔试真题题解·拼多多笔试题解
luj_176842 分钟前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
一水鉴天1 小时前
问题分类的三元组映射体系与求解方法论 20260901(千问)
人工智能·算法·机器学习
breeze jiang1 小时前
LangChain Memory 实战:用 InMemoryChatMessageHistory 管理多轮对话
前端·算法·langchain
地平线开发者16 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球19 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao1 天前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid1121 天前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展