剑指Offer(13)顺时针打印矩阵 包含min的栈

剑指Offer(13)顺时针打印矩阵 包含min的栈

题目:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:

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.

思路:

12

34 输出为 1243

对于任意一个矩阵,可以找到他的位于正对角线两边界的元素,

1234

5678

4329 对于这个矩阵 第一个边界元素是1 ,第二个边界元素是9。

假设 1 的坐标为 (row1,cow1)

假设 9 的坐标为 (row2,cow2)

对于任意一个矩阵,都可以

从 cow1++到 cow2 其中row不变 输出每个元素 第一行

然后 row1 ++ 到 row2 其中cow不变 输出每个元素 最后一列

然后 cow2-- 到cow1 其中row不变 输出每个元素 最后一行

row2-- 到row1 其中cow不变 输出每个元素。 第一列

当完成一次循环时,(row1++,colw1++) 如果此时没有出现 row1>=row2 则继续上面的函数输出。

代码:

    ArrayList arrayList = new ArrayList();
    public ArrayList<Integer> printMatrix(int[][] matrix)
    {
        int row1 = 0;
        int  cow1= 0;
        int row2 = matrix.length - 1;
        int  cow2= matrix[0].length - 1;
        while (cow1 <= cow2 && row1 <= row2) {
            printEdge1(matrix, row1++, cow1++, row2--, cow2--);
        }
        return arrayList;
    }
    public  void printEdge1(int[][] m, int row1, int cow1, int row2, int cow2)
    {
        if(row1==row2)
        {
            for (int i = cow1; i <= cow2; i++)
            {
                arrayList.add(m[row1][i]);
                //只有一行, 遍历每列
            }
        }
        else if (cow1==cow2)
        {
            for (int i = row1; i <= row2; i++)
            {
                arrayList.add(m[i][cow1]);
                //只有一列  遍历每行
            }
        }
        else
        {
            int c=cow1;
            int r=row1;
            while(c!=cow2)
            {
                arrayList.add(m[row1][c]);
                // 左到右
                c++;
            }
            while(r!=row2)
            {
                arrayList.add(m[r][cow2]);
                //上到下
                r++;
            }
            while(c!=cow1)
            {
                arrayList.add(m[row2][c]);
                // 右到左
                c--;
            }
            while(r!=row1)
            {
                arrayList.add(m[r][cow1]);
                // 下到上
                r--;
            }
        }
    }

题目:

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)。

思路:

要求如果当前最小元素的栈被弹出了,如何得到下一个最小的元素呢?

处理方法是建立一个辅助栈,每次入栈前将当前元素a与辅助栈里的顶部元素b比较,如果a>b,则入栈一个b,反之入栈a.

代码:

    private Stack<Integer> dataStack=new Stack<>();
    private Stack<Integer> helpStack=new Stack<>();
    public void push(int node) {
        dataStack.push(node);
        if (helpStack.isEmpty())
            helpStack.push(node);
        else
            helpStack.push(Math.min(node,helpStack.peek()));
    }
    public void pop() {
        dataStack.pop();
        helpStack.pop();
    }
    public int top() {
        return dataStack.peek();
    }
    public int min() {
        return helpStack.peek();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旋转变压器---数字转换器作为现代伺服系统中被广泛使用的角位置测量系统,大量应用于高精度及大中型数控系统、机器人控制、工业控制、武器火力控制及惯性导航领域中。 传统的角测量系统面临的问题有:体积、重量、功耗偏大,调试、误差补偿试验复杂,费用较高。本文从微型化、智能化的方向进行研究,是解决传统角测量系统所面临问题的好途径。 本文所研究的旋转变压器---数字转换器是由信号调理模块、系统芯片C8051F064和输出控制模块组成的。整个系统的三路输入信号为X=AsinOcosar、Y=Acosθcos ot和Z=Ucosar(基准信号),输出信号为偏转角θ,输出形式为16 位数字量。信号调理模块是由模拟电路组成的,包括信号输入电路、相敏整流电路、滤波电路和直流稳压电源电路,其难点在于相敏整流电路的设计。信号调理模块的主要功能是把输入的交流信号X=AsinOcosor、Y=Acosθcosot转变成直流信号Bsinθ和Bcosθ,并使输出的直流信号在0~2.4V之间;系统芯片C8051F064是CYGNAL公司近年来推出的一款功能齐全的完全集成的混合信号片上系统型单片机。在本文所设计的系统中,系统芯片的输入信号为直流信号Bsinθ和Bcosθ,通过片内自带的2个16位A/D转换器对输入信号的数据进行采样和转换,并对转换完的数据进行滤波处理,以减小由于外界干扰而产生的误差,再用除法和反正切函数解算出偏转角θ的16位数字量;输出控制模块主要完成的功能是通过UARTO向计算机实时发送由单片机计算出来的偏转角度0的16位数字量,而串口的RS-232电平与单片机系统采用的是TTL电平之间的转换所采用的转换芯片是MC1488和MC1489。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值