8月算法训练------第十五天(模拟)解题报告
题目类型:模拟
题目难度:简单
第一题、剑指 Offer 29. 顺时针打印矩阵
- 题目链接:剑指 Offer 29. 顺时针打印矩阵
- 思路分析:
定义四个边界:上t
,下b
,左l
,右r
;
当从左向右遍历时,说明是上t
的一行,左边界为l
,右边界为r
,当遍历完成时,要将++t
,并且判断l
是否大于b
;
当从上往下时,遍历的是右r
的一列,上边界为t
,下边界为b
,当遍历完成时,要将--r
,并且判断r
是否小于l
;
当从右往左时,遍历的是下b
的一行,右边界为r
,左边界为l
,当遍历完成时,要将--b
,并且判断b
是否小于t
;
当从下往上时,遍历的是左l
的一列,下边界为b
,上边界为t
,当遍历完成时,要将++l
,并且判断l
是否大于r
; - 代码:
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0) return new int[0];
int l = 0, r = matrix[0].length - 1;
int t = 0, b = matrix.length - 1, x = 0;
int[] res = new int[(r+1)*(b+1)];
while(true){
for(int i = l; i <= r; i++) res[x++] = matrix[t][i];
if(++t > b) break;
for(int i = t; i <= b; i++) res[x++] = matrix[i][r];
if(--r < l) break;
for(int i = r; i >= l; i--) res[x++] = matrix[b][i];
if(--b < t) break;
for(int i = b; i >= t; i--) res[x++] = matrix[i][l];
if(++l > r) break;
}
return res;
}
}
第二题、剑指 Offer 31. 栈的压入、弹出序列
- 题目链接:剑指 Offer 31. 栈的压入、弹出序列
- 思路分析:
运用LinkeList模拟为栈使用,用来模拟题中的栈,当popped数组不是栈的返回顺序时,算到最后栈就不是空的。 - 代码:
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
LinkedList<Integer> list = new LinkedList<>();
int i = 0;
for(int num : pushed){
list.push(num);
while(!list.isEmpty() && list.peek() == popped[i]){
list.pop();
i++;
}
}
return list.isEmpty();
}
}