題目來(lái)源:牛客網(wǎng)
題目描述
輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否可能為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對(duì)應(yīng)的一個(gè)彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個(gè)序列的長(zhǎng)度是相等的)
針對(duì)本題,通過(guò)列舉分析,發(fā)現(xiàn)不論出棧順序如何,首次壓入棧中的元素,要么第一個(gè)出棧,要么是最后一個(gè)。其他情況都不是該棧的出棧順序。(這兩個(gè)序列的長(zhǎng)度是相等的,是下面代碼成立的前提)
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if (pushA[0] == popA[0] || pushA[0] == popA[popA.length - 1]) {
return true;
}
return false;
}
}
考慮不等長(zhǎng)的情況,做法如下
創(chuàng)建ArrayList對(duì)象list,用來(lái)模擬壓棧,如果pushA的值不等于popA的值,則添加到list中。如果相等則不添加,相當(dāng)于出棧,然后遍歷list中的元素,此時(shí)應(yīng)該從后面遍歷,因?yàn)楹竺嫦喈?dāng)于棧頂,如果當(dāng)前的值等于popA的值,則刪除(remove),直到不等于為止。直到popA遍歷完畢。
如果list中元素個(gè)數(shù)大于0并且popA沒(méi)遍歷完,則說(shuō)明才出棧順序不是正確的。
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if (pushA.length == 0|| popA.length == 0) {
return false;
}
ArrayList<Integer> list = new ArrayList<>();
int i = 0;
int j = 0;
while (i < pushA.length && j < popA.length) {
if (pushA[i] != popA[j]) {
list.add(pushA[i]);
}else {
j++;
for (int x = list.size() - 1; x >= 0; x--) {
if (j != popA.length && popA[j] == list.get(x)) {
list.remove(x);
j++;
}else {
break;
}
}
}
i++;
}
return list.size() != 0 && j != popA.length ? false : true;
}
}