今天在写力扣的739. 每日温度,在使用单调栈的过程中发现一个等号赋值的特殊现象。正常来说,一般是先执行等号右侧的逻辑,执行完成后再执行等号左侧的逻辑。
但是在以下代码中,会先执行等号左侧的 peek() 逻辑,再执行右侧的 pop() 逻辑。按照先右侧后左侧的惯例,这里的代码应该反过来写,即先取值计算后再出栈。但是反过来写的话,就会报错。
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Deque.peek()" is null
以下代码是可以正确执行的,猜测可能跟数组有关,具体原因不是很确定。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] ans = new int[n];
Deque<Integer> st = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
while (!st.isEmpty() && temperatures[i] > temperatures[st.peek()]) {
ans[st.peek()] = i - st.pop();// 注意这里
}
st.push(i);
}
return ans;
}
}