C++ 数组遍历(顺时针遍历)

顺时针打印矩阵(数组遍历)

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

结果

运行时间:3ms

占用内存:480k

知识点

  • 数组遍历
  • vector 容器,栈操作

代码

class Solution {
public:
    vector<int> printMatrix(vector<vector<int>> matrix) {
        int row=matrix.size();//列数(使用时下标-1)
        int col=matrix[0].size();//行数
        vector<int> result;//栈 vector容器
        /*                                    top
            array[0][0]=1	array[0][1]=2	array[top][2]=3	array[0][3]=4	array[0][4]=5
       left array[left][0]=6	array[1][1]=7	array[1][2]=8	array[1][3]=9	array[1][right-1]=10  right
            array[2][0]=11	array[2][1]=12	array[btm][2]=13	array[2][3]=14	array[2][4]=15
                                              btm
        */
        /*
        每一行或列的输出都会使得下次输出减少一行或一列
        如何判断还有项需要输出为重点!!!
        剥皮过程::::::::::
        第一行判断:无
        最后一列判断:首行数<尾行数(有宽度)
        最后一行判断:首行数<尾行数 且 首列数<尾列数(有长度,有宽度)
        第一列判断:首行数+1<尾行数 且 首列数<位列数(有长度,有宽度) (首行+1 因为引进去了两行了)
        */
        int left=0,right=col-1,top=0,btm=row-1;//数组下标从零开始,所以减一
        while(left<=right&&top<=btm)//左右 上下 如果没完成
            {
            for(int i=left;i<=right;i++)//首行 行不变,列++ 
                result.push_back(matrix[top][i]);
            if(top<btm)//用行判断是否有列可以输出;;;多余的行数中才能有列
                for(int i=top+1;i<=btm;i++)//最右列,列不变,行++
                    result.push_back(matrix[i][right]);
            if(top<btm&&left<right)//有多余的行+多于的列;;才能有最下面的一行输出
                for(int i=right-1;i>=left;i--)//最下行,行不变,列--
                    result.push_back(matrix[btm][i]);
            if(top+1<btm&&left<right)//有多余的行+多余的列;;才能有最左边的一列输出,top+1 :: 上边已经输出了一列。
                for(int i=btm-1;i>=top+1;i--)//最左列,列不变,行++
                    result.push_back(matrix[i][left]);
            left++;right--;top++;btm--;//
        }
        return result;
    }
};

总结

1)写代码注意判断条件!!!
2)首先找输入输出,判断变与不变(什么时候变)!!!
3)好脑子不如画个图,写写数!!! 何况你有好脑子吗?你有脑子吗?
4)代码变量名称起的好,省去好多!!!多敲几个字母,多定义几个变量不一定是坏事!!!
4)代码相关

二维数组a[M-1][N-1]={M*N},

二维数组参考

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值