剑指offer-模拟专题
29.顺时针打印矩阵
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length==0) return new int[0];
int m=matrix.length,n=matrix[0].length;//m行,n列
int []res=new int[m*n];
int l=0,r=n-1,u=0,d=m-1,x=0;
while(true){
for(int i=l;i<=r;++i){
res[x]=matrix[u][i];
x++;
}
u++;
if(u>d) break;
for(int i=u;i<=d;++i) {
res[x]=matrix[i][r];
x++;
}
r--;
if(r<l) break;
for(int i=r;i>=l;--i){
res[x]=matrix[d][i];
x++;
}
d--;
if(d<u) break;
for(int i=d;i>=u;--i){
res[x]=matrix[i][l];
x++;
}
l++;
if(l>r) break;
}
return res;
}
}
思考
设定好边界,注意细节
31.栈的压入、弹出序列
class Solution {
public boolean validateBookSequences(int[] pushed, int[] popped) {
Stack<Integer> stack = new Stack<>();
int i = 0;
for(int num : pushed) {
stack.push(num); // num 入栈
while(!stack.isEmpty() && stack.peek() == popped[i]) { // 循环判断与出栈
stack.pop();
i++;
}
}
return stack.isEmpty();
}
}
思考
入栈操作: 按照压栈序列的顺序执行。
出栈操作: 每次入栈后,循环判断 “栈顶元素 === 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。