该题目是Amazon的在线技术笔试的题目:java
直接上代码吧,代码中有说明。只要咱们实现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); } } }