顺时针打印矩阵

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

就像这样把他打印出来

一开始还好,到4然后转向,但是会发现,转完一圈之后,是从6开始的!
而且一圈不一定四个方向都有,比如3X3的一个第二圈相当于只有中间那个!

所以我们的思路是,把每一圈的规则写上,然后修改每一圈的起点
比如上图第一圈是1为起点,第二圈是6为起点
而6的位置是1的位置横纵列相加的位置

方法

用while循环保证每一圈的起点合法
内部用四个for循环(后两个还要记得判定是否是最后一行或者最后一列),用列表进行增加,最后去重

源代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int r=matrix.length;
        int c=matrix[0].length;
        if(r==0||c==0)return null;
        //int [][]m;=new int[r][c]
        //左上节点的个数,以一圈为一个轮回,然后将每个轮回读入的数放到一个列表中,然后将原来的置为0;
        ArrayList<Integer>m=new ArrayList<Integer>();
        //start这个作为起始点
        int start=0;
        //这里没有等于
        while(start<r&&start<c){
            for(int j=start;j<c;j++){
                m.add(matrix[start][j]);
            }
            for(int i=start;i<r;i++){
                m.add(matrix[i][c-1]);
            }
            if(start!=r-1){
                for(int j=c-1;j>=start;j--){
                    m.add(matrix[r-1][j]);
                }
            }
            //这里要做判定,因为最后一行或一列在上面就读过了,这里重复了
            if(start!=c-1){
                for(int i=r-1;i>=start;i--){
                    m.add(matrix[i][start]);
                }
            }
            start++;
            r--;
            c--;
        }
       for(int i=0;i<m.size();i++){
            for(int j=i+1;j<m.size();j++){
                if(m.get(i)==m.get(j)){
                    m.remove(j);
                }
            }
        }
        return m;

    }
}
全部评论

相关推荐

努力学习的小绵羊:我反倒觉得这种挺好的,给不到我想要的就别浪费大家时间了
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务