我正试图解决LeetCode上的经典有效括号问题。
这就是我所做的,它可以通过所有的测试用例:
public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
for (Character c : s.toCharArray()) {
if (c.equals('{') || c.equals('[') || c.equals('(')) {
stack.push(c);
} else {
Character check = stack.isEmpty() ? ' ' : stack.pop();
if (check != (c - 1) && check != (c - 2)) { //***
return false;
}
}
}
return stack.isEmpty();
}
但是当我把***行改成这个:
if (!check.equals(c - 1) && !check.equals(c - 2)) {}
虽然它可以通过编译器,但它不能返回正确的答案,甚至不能像"((";。
通常,我们不应该使用equals((而不是==来比较Character吗?
如果您将调试添加到有问题的If块
System.out.println(c);
System.out.println(c -1);
System.out.println(c -2);
您将看到后面跟着两个int值的char。
在您的原始代码中,正在进行类型转换。
在我的IDE中,甚至有一个警告
不太可能的equals((参数类型:int似乎与Character无关
如以上评论所述:
从Character中减去一个int将返回一个int值。当使用equals时,您需要将其强制转换回char,因为它将自动装箱为Integer