原題不放了。其實就是考已知入棧序列為1,2,3,4,n=4,問輸入的出棧序列是否合理(合理輸入yes,不合理輸出no)。
輸入:41
32輸出:
noinv為索引,指向入棧序列。outv為索引,指向出棧序列。
新建乙個棧stack來模擬出棧過程,如果合理,那麼stack的出棧過程會與出棧序列依次匹配。
考慮出棧序列合理,那麼如果當前inv指向的元素與outv指向的元素不一樣,那麼就將當前inv指向的元素入棧stack,inv++;如果當前inv指向的元素與outv指向的元素一樣,那麼就出棧stack,outv++。
考慮出棧序列不合理,那麼inv就會 >= n。
以如上實際例子為例,當前stack已經入棧4321了,判斷棧頂與出棧序列當前所指元素是否相等,當前相等,則進入if,stack出棧,即成功模擬了出棧序列當前所指元素的出棧,然後出棧序列索引後移。
判斷棧頂與出棧序列當前所指元素是否相等,當前不相等,則進 入else,將入棧序列當前所指元素入棧stack,即成功模擬了入棧序列當前所指元素的入棧,然後入棧序列索引後移。
判斷棧頂與出棧序列當前所指元素是否相等,當前相等,則進入if,stack出棧,即成功模擬了出棧序列當前所指元素的出棧,然後出棧序列索引後移。
判斷棧頂與出棧序列當前所指元素是否相等,當前不相等,則進 入else,但入棧序列的索引指向了乙個不存在的元素,因為所有元素都已經入棧,所以不應該再有元素可以入棧了。這時就說明了出棧序列是不合理的。
outli =
for i in
range(4
):eval
(input()
))n =len
(outli)
inputli =
[i for i in
range(1
,n+1)]
defsolve
(n,inputli,outli)
: stack =
1)outv =
0#指向未被掃瞄的出棧序列的元素
inv =
1#指向未被掃瞄的入棧序列的元素,已經掃瞄了乙個
while
(outv < n)
:if stack[-1
]== outli[outv]
:#棧頂元素和出棧序列當前元素一樣,說明匹配了乙個出棧序列的元素
#就出棧
stack.pop(
) outv+=
1else
:if inv == n:
#掃瞄所有入棧序列後,inv會變成n,但變成n後就不應該再進入else了
#因為所有元素都已經入過棧了
return
'no'
#棧頂元素和出棧序列當前元素不一樣,說明它還沒入棧
#就入棧
) inv+=
1return
'yes'
print
(solve(n,inputli,outli)
)
2015筆試記錄
0916去哪兒網 1.removeelement arr,index 這麼簡單的題竟然寫錯了,把splice方法的返回值記錯了,splice返回的是刪除的元素陣列!2.陣列亂序問題 以前看過fisher yates的洗牌演算法,所以有點思路,但還是有細節錯誤 math.random 的範圍是 0,1...
中興2016筆試
簡答題 1 ip位址和mac位址有什麼區別?為什麼要有這兩種位址?對於ip位址,相信大家都很熟悉,即指使用tcp ip協議指定給主機的32位位址。ip位址由用點分隔開的4個8八位組構成,如192.168.0.1就是乙個ip位址,這種寫法叫點分十進位制格式。ip位址由網路位址和主機位址兩部分組成,分配...
2019 6 5筆試回顧
1.union和union all的區別 答案來自w3cshool select city,country from customers union select city,country from suppliers 上面的語句返回t 消費者和t 商的城市,國家。set 無重複 注 武漢,中國 和...