[没营养_没技巧_费细节]顺时针打印矩阵

顺时针打印矩阵

http://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a

题目描述

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

过程:

一开始没注意矩阵,后来又卡在奇数矩阵最后一个不打印(边界设置为<时前面的都很完美,但是最后一个落单的话不输出。)改边界为=后遇到了极端情况竖排一列,看题解发现这题根本无技巧可言都是细节费事(想到了魔方旋转打印一行删一行,但c++旋转矩阵甚麻烦)。打算半个小时的题花了2个小时。

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> v;
        int height = matrix.size();
        int width = matrix[0].size();
        int i=0, j=0, layer=1;
        for(int t=0;t<height*width;){
            for(;j<=width-layer;++t,++j)
                v.push_back(matrix[i][j]);
            i++;j--;
            if(t==height*width) //防止极端情况的
                break;
            for(;i<=height-layer;++t,++i)
                v.push_back(matrix[i][j]);
            i--;j--;
            if(t==height*width) //防止极端情况的
                break;
            for(;j>=layer-1;++t,--j)
                v.push_back(matrix[i][j]);
            i--;j++,layer++;
            if(t==height*width)//防止极端情况的
                break;
            for(;i>=layer-1;++t,--i)
                v.push_back(matrix[i][j]);
            i++;j++;
            if(t==height*width)//防止极端情况的,其实真正的极端情况只有这里会
                break;
        }
        return v;
    }
};

极端情况靠计数结束防止,出现极端情况的肯定是已经结束了(触碰边界)
旋转矩阵思路(一个班小时。。,py多容易。。)

class Solution {
public:
    vector<vector<int>> rotate(vector<vector<int>> v){
        vector<vector<int>> map;
        if(v.empty())
            return map;
        for(int i=v[0].size()-1;i>=0;--i){
            vector<int> row;
            for(int j=0;j<v.size();++j){
                row.push_back(v[j][i]);
            }
            map.push_back(row);
        }
        return map;
    }
    vector<int> printMatrix(vector<vector<int> > matrix){
        vector<int> v;
        while(!matrix.empty()){
            for(int i=0;i<matrix[0].size();++i){
                v.push_back(matrix[0][i]);
            }
            matrix.erase(matrix.begin());
            matrix = rotate(matrix);
        }
        return v;
    }
};
全部评论

相关推荐

10-29 19:45
吉林大学 Java
从零开始数:自我评价没有必要写,但是看起来你应该是学了csdiy的一些课程,可以在专业技能里面写上自己比较熟悉操作系统和计网,但如果你是找Java的话,把第一个项目换了吧,现在看起来有点四不像。 无论是黑马点评或者说做个轮子项目,刷题和八股也搞起来吧,而且也没必要等到寒假,最近就可以开始找,找到就偷偷实习呗,别被逮到就行了。
点赞 评论 收藏
分享
rbjjj:太杂了吧,同学,项目似乎都没深度,都是api调度耶,分层架构思想没有体现出来了,前端没有前端优化前端工程化体现,后端微服务以及分层架构没体现以及数据安全也没体现,核心再改改,注重于计算机网络,工程化,底层原理吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务