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

顺时针打印矩阵

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;
    }
};
全部评论

相关推荐

03-31 18:02
门头沟学院 Java
点赞 评论 收藏
分享
04-03 13:58
上海大学 Java
3月15号笔的,1-AC\2-90%\3-60%\4-AC泡了半个月今天早上起来看不通过,到底是谁在面试网易啊
只会CV的高级程序员:你a不过 你是985也找你面试 不太懂现在用人单位到底怎么想的 建议不用笔试 直接每个985都招就行了 挂科的退学的
投递网易等公司6个岗位 >
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务