该题目是Amazon的在线技术笔试的题目:
直接上代码吧,代码中有说明。只要我们实现calculateOperationSequence()方法就可以了
package amazon2;
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
import java.util.*;
import java.util.Stack;
import java.util.StringTokenizer;
/**
* 根据栈的出栈序列和入栈序列,打印push和pop的顺序,push和pop后面必须跟上元素在originalArray中的位置。比如
* originalArray:1 2 3 4
* resultArray:4 3 2 1
* putput:push1|push2|push3|push4|pop4|pop3|pop2|pop1
*
* 算法思路:
* stack//存放入栈的元素的值;stackPos:存放入栈的元素在originalArray中的索引
* while(true){
* if(stack为空){
* if(originalArray中还有元素){
* originalArray中的一个元素入栈stack;
* originalArray中的该元素入栈stackPos;
* }else{
* break;//此时说明
* }
* }else{//栈不空
* if(stack的栈顶元素和resultArray中的当前元素相等){
* pop();
* }else{
* if(originalArray中还有元素){
* originalArray中的一个元素入栈stack;
* originalArray中的该元素入栈stackPos;
* }else{
* return "None";
* }
* }
* }
* }
*
* @author songjie
*
*/
public class Solution2
{
private String calculateOperationSequence(int[] originalArray, int[] resultArray)
{
// your code is here
if(originalArray == null || resultArray == null || originalArray.length == 0 || resultArray.length ==0
|| originalArray.length != resultArray.length){
throw new IllegalArgumentException("invalid arguments");
}
StringBuffer sb = new StringBuffer("");
Stack<Integer> stack = new Stack<Integer>();
Stack<Integer> stackPos = new Stack<Integer>();
int originalPos = 0;
int resultPos = 0;
while(true){
if(stack.isEmpty()){//stack is empty
if(originalPos>=originalArray.length) break;
stack.push(originalArray[originalPos]);
stackPos.push(originalPos++);
sb.append("push"+originalPos+"|");
}else{//stack is not empty
int peek = stack.peek();
if(resultArray[resultPos] == peek){
stack.pop();
sb.append("pop"+(stackPos.pop()+1)+"|");
resultPos++;
}else if(originalPos<originalArray.length){
stack.push(originalArray[originalPos]);
stackPos.push(originalPos++);
sb.append("push"+originalPos+"|");
}else{
return "None";
}
}
}
return sb.toString().substring(0, sb.length()-1);
}
public static void main(String[] args)
{
Solution2 solution = new Solution2();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine())
{
String strLine1 = scanner.nextLine();
StringTokenizer stringTokenizer1 = new StringTokenizer(strLine1);
//Initialize the original array
int arrayLength = stringTokenizer1.countTokens();
int[] originalArray = new int[arrayLength];
for(int i = 0; i < arrayLength; i++)
{
originalArray[i] = Integer.parseInt(stringTokenizer1.nextToken());
}
//Initialize the result array
String strLine2 = scanner.nextLine();
StringTokenizer stringTokenizer2 = new StringTokenizer(strLine2);
arrayLength = stringTokenizer2.countTokens();
int[] resultArray = new int[arrayLength];
for(int j = 0; j < arrayLength; j++)
{
resultArray[j] = Integer.parseInt(stringTokenizer2.nextToken());
}
String operationSequence = solution.calculateOperationSequence(originalArray, resultArray);
System.out.println(operationSequence);
}
}
}