这是我第一次在StackOverflow上发帖,如果我的帖子格式不标准,我很抱歉,如果我的问题很愚蠢,请原谅我.
我正在对hackerrank进行挑战,目前我的问题目标如下:
您有一个空序列,您将获得N个查询.每个查询都是以下三种类型之一:
- 将元素x推入堆栈.
- 删除堆栈顶部的元素.
- 打印堆栈中的最大元素.
我已经解决了,但我在讨论中看到了另一种解决方案,并考虑修改它.替代解决方案是:
public class Solution {
public static void main(String[] args) {
Scanner inp = new Scanner(System.in);
int n = inp.nextInt();
Stack<Integer> S = new Stack<>();
Stack<Integer> largest_stack = new Stack<>();
largest_stack.push(0);
for(int i=1; i<=n;i++) {
int query = inp.nextInt();
if(query==1){
int newtop=inp.nextInt();
S.push(newtop);
if(S.peek()>=largest_stack.peek()){
largest_stack.push(S.peek());
}
}
if(query==2) {
if(S.peek()==largest_stack.peek()){
largest_stack.pop();
}
S.pop();
}
if(query==3){
System.out.println(largest_stack.peek());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想在这部分用newtop替换S.peek()
if(S.peek()>=largest_stack.peek()){
largest_stack.push(S.peek());
}
Run Code Online (Sandbox Code Playgroud)
所以我明白了
if(S.peek()>=largest_stack.peek()){
largest_stack.push(newtop);
}
Run Code Online (Sandbox Code Playgroud)
执行此操作后,它将通过默认测试用例.但它总共失败了9/27个测试用例.以下是其中一个失败的测试用例的一小部分.有100000个查询,但我只采取了前21个.
21
1 809288903
3
1 55967040
1 967650885
1 21752006
3
2
1 61250743
1 975612397
3
3
2
3
2
3
2
2
3
3
2
1 784642399
Run Code Online (Sandbox Code Playgroud)
它为什么失败?任何帮助将非常感激.
编辑:
如果我输入上面用非修改代码发布的值,我得到
809288903
967650885
975612397
975612397
967650885
967650885
809288903
809288903
Run Code Online (Sandbox Code Playgroud)
修改后的代码:
809288903
967650885
975612397
975612397
975612397
975612397
975612397
975612397
Run Code Online (Sandbox Code Playgroud)