📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 |问题 8(1)

📅  最后修改于: 2023-12-03 15:23:04.242000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2017 |问题 8

这是一道计算机科学问题,出现在2017年国际空间研究组织(ISRO)的计算机科学考试中。这道问题是有关数组操作的。

问题描述

给定一个长度为n的数组arr[],对于每个元素arr[i],需要找到它到数组中最接近它的左侧且比它小的元素。

输入格式

输入的第一行包含一个整数T,表示测试用例的数量。每个测试用例的输入有两行。第一行包含一个整数n,表示数组的长度。第二行包含n个空格分隔的整数,表示数组arr[]。

输出格式

对于每个测试用例,输出一行,包含n个空格分隔的整数,表示每个元素的答案。如果没有符合条件的元素,则输出-1。

示例

输入:

2 4 1 3 2 4 5 1 2 3 4 5

输出:

-1 1 1 2 -1 -1 -1 -1 -1

解题思路

我们可以使用栈来解决这个问题。我们首先初始化一个空栈stack[]。然后我们遍历数组arr[],对于每个元素arr[i],我们删除该栈内所有比arr[i]大的元素。然后,我们查看stack[]的栈顶元素,如果stack[]不为空且栈顶元素比arr[i]小,我们就打印该栈顶元素。最后,我们将arr[i]入栈到stack[]中。

代码实现

def printPrevSmaller(arr, n):

    S = []

    for i in range(n):

        while(len(S) > 0 and S[-1] >= arr[i]):
            S.pop()

        if(len(S) == 0):
            print('-1', end = ' ')
        else:
            print(S[-1], end = ' ')

        S.append(arr[i])

for _ in range(int(input())):
    n = int(input())
    arr = list(map(int,input().split()))
    printPrevSmaller(arr, n)
    print()

以上就是解决这个问题的完整Python代码。