拼多多笔试真题 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 出库。可以证明:能成功时,动作序列是唯一的。
    请判断能否按号出完。能则输出由 I 和 O 组成的动作串(恰好 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 的排列。

输出描述

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

样例1

输入

复制代码
4
3 1 2 4

输出

复制代码
IIOIOOIO

说明

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

样例2

输入

复制代码
3
2 3 1

输出

复制代码
N

说明

2、3 入栈后,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)
}
相关推荐
吴长建先生重名了5 分钟前
电商订单系统在Docker和Kubernetes中部署的高
算法
東隅已逝,桑榆非晚2 小时前
算法2. 双指针法-复写零
c++·笔记·学习·算法
云析赢指标公式网43 小时前
文华财经指标源码笔记:WINNER筹码函数、控盘变量与MACD变体的调试记录
java·笔记·算法
CC数分4 小时前
统计学基础|先把问题问对:数据分析的六大类型
大数据·人工智能·算法
地平线开发者5 小时前
CLIP 的训练机制:从对比学习到图文对齐
深度学习·算法·自动驾驶
hetao17338375 小时前
2026-11-02 hetao1733837 的刷题记录
c++·算法
Geektec5 小时前
IMU 选型完全指南:从硬件参数到算法融合的系统工程视角
算法·imu·陀螺仪·加速度计·元器件选型
CQU_JIAKE5 小时前
11.2【A】
算法
Godspeed Zhao6 小时前
从零开始学AI21——决策树
算法·决策树·机器学习
开开心心就好6 小时前
网页图片批量下载工具,输入链接就保存
服务器·算法·leetcode·支持向量机·pdf·ocr·1024程序员节