题解剑指offer

刷剑指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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值