在解决这个问题时,我在使用 get
方法 ArrayList
直接进行状况检查。
测试用例失败的代码:
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
Stack <Integer> s= new Stack<>();
ArrayList <Integer> m= new ArrayList<>();
for(int i=0;i<n;i++){
int x=sc.nextInt();
if(x==1){
int y=sc.nextInt();
if(m.isEmpty() || y>=m.get(m.size()-1))
m.add(y);
s.push(y);
}
else if(x==2){
// Here I am using `get` to check the last value of ArrayList with the top of stack
if(m.get(m.size()-1)==s.peek()) {
m.remove(m.size()-1);
}
s.pop();
}
else {
System.out.println(m.get(m.size()-1));
}
}
}
}
但是当给一个变量分配相同的语法并将其用于条件检查时,它就通过了。
通过所有测试用例的代码:
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
Stack <Integer> s= new Stack<>();
ArrayList <Integer> m= new ArrayList<>();
for(int i=0;i<n;i++){
int x=sc.nextInt();
if(x==1){
int y=sc.nextInt();
if(m.isEmpty() || y>=m.get(m.size()-1))
m.add(y);
s.push(y);
}
else if(x==2){
// When assigning the same to a variable it passed all test cases.
int a = m.get(m.size()-1);
if(a==s.peek()) {
m.remove(m.size()-1);
}
s.pop();
}
else {
System.out.println(m.get(m.size()-1));
}
}
}
}
由于我是java新手,我对 get
方法 ArrayList
. 请向我解释一下机器的内部工作原理 get
为什么它失败了,或者我遗漏了什么?
3条答案
按热度按时间inkz8wg91#
我认为这个问题与整数类型的自动装箱/拆箱有关。在声明中
比较是将a整数值(a)与未装箱整数(s.peek())进行比较。
在声明中
比较是在两个整数值之间进行的,即在两个引用之间。由于两个引用不同,因此相等性检查失败。
要修复最新语句,可以使用:
或者使用整数类型的equals方法。
92vpleto2#
s
以及m
商店Integer
对象,您不应该使用==
.替换
m.get(m.size()-1)==s.peek()
与m.get(m.size()-1).equals(s.peek())
你的代码也能用。第二种方法有效的原因是
m.get(m.size()-1)
到一个int
变量Integer
值,然后比较a==s.peek()
是在int
值(来自s.peek()
也没有装箱)。a8jjtwal3#
我没有考虑任务本身(作为一个问题应该是独立的,我不打算访问随机链接),但我相信问题来自您在这里使用的类型。
在第一种情况下,
m.get(m.size()-1)==s.peek()
左右两侧都是Integer
s。因此,当你使用==
你实际上是在比较对象引用。这种比较只会在某些时候起作用(我相信它适用于-128到127之间的整数)。你可以用equals
来解决这个问题。另一方面,我们有
int a = m.get(m.size()-1); if(a==s.peek())
. 在这里,在第一部分你得到Integer
首先,然后它被分配给int
变量拆箱发生在这里。然后,当你有一个条件,你比较int
和一个Integer
. 在这种比较中Integer
打开一个int
简单的比较int
发生在这里(见jls-5.6.2中的第一点)。正因为如此,它在这种情况下工作正常。