刷剑指offer遇到的一些问题,记录下来以备以后查看。
题20 顺时针打印矩阵元素
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
思考:
可以把矩阵想象成若干个圈,一圈一圈的打印。这道题难点是圈打印时边界条件的判断。
public ArrayList<Integer> printMatrix(int[][] matrix){
ArrayList<Integer> list = new ArrayList<Integer>();
circlePrint(matrix, list, 0);
return list;
}
public void circlePrint(int[][] matrix, ArrayList list, int start){
int row = matrix.length;
int col = matrix[0].length;
if(matrix == null || col<1 || row<1|| start <0)
return;
if(col <=2*start || row<=2*start)
return;
int stopX = col - 1 - start;
int stopY = row - 1 - start;
// 打印最上一行
for(int i=start; i<=stopX; i++)
list.add(matrix[start][i]);
// 打印右侧一行
if(start<=stopX){
for(int i=start+1; i<=stopY; i++)
list.add(matrix[i][stopX]);
}
// 打印最下一行
if(start<stopX && start<stopY){
for(int i=stopX-1; i>=start; i--)
list.add(matrix[stopY][i]);
}
// 打印左侧一行
if(start <stopX && start < stopY-1){
for(int i = stopY-1; i>=start+1; i--){
list.add(matrix[i][start]);
}
}
circlePrint(matrix, list, start+1);
}
题21 查找栈最小元素
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
思考:
需要定义一个最小元素和临时栈,每次将最小的元素放入临时栈中保存下来。
public class MiniStack {
Stack stack = new Stack();
public void push(int node){
stack.push(node);
}
public void pop(){
stack.pop();
}
public int top(){
int top = (int)stack.pop();
return top;
}
public int min(){
Stack sta = new Stack();
int min = (int)stack.pop();
sta.push(min);
while(!stack.isEmpty()){
int temp = (int)stack.pop();
if(min>temp){
min = temp;
}
sta.push(temp);
}
while(!sta.isEmpty()){
stack.push(sta.pop());
}
return min;
}
}