剑指offer-顺时针打印矩阵

本文介绍了一种使用Java实现的顺时针打印矩阵的方法,通过设置标识矩阵来跟踪已访问的元素,避免重复访问。文章详细解释了解题思路,并提供了完整的代码示例,特别注意了矩阵宽度和高度为1的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer-顺时针打印矩阵

题目描述

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

解题思路

我采用的是Java代码,其中主要思想是采用了一个和输入matrix一样大小的flagMatrix设置标识矩阵,当没被访问所有值为1,当访问完后值就为0,就可以知道matrix对应位置的值是否被访问,按顺时针方向进行数组的访问,将值add到list当中。编写代码时,有实例通过不了是没有考虑到矩阵的宽度和长度为1的情况,从而出现数组越界,所以代码中对应位置加了判断条件判断width是否为1和height是否为1。具体实现过程参阅代码。
题目链接.

代码块

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       int i=0,j=0;
		int count=0;//用于计数访问量是否超过二维数组元素个数
		int size=matrix.length*matrix[0].length;//二维数组元素个数
		int height=matrix.length; //二维数组矩阵高度
		int[][] flagMatrix=new int[height][width];
	//	System.out.println("size:"+size+" width:"+width+" height:"+height);
		ArrayList<Integer> list=new ArrayList<Integer>();
		for(i=0;i < height;i++){
			for(j=0;j < width;j++){
				flagMatrix[i][j]=1;
				System.out.println(matrix[i][j]);
			}
		}
		i=0;
		j=0;
		while(count<size){
		   while(flagMatrix[i][j]!=0){
			 //  System.out.println(matrix[i][j]);
			   list.add(matrix[i][j]);
			   flagMatrix[i][j]=0;
			   j++;
			   count++;
			   if(j==width){
				   break;
			   }
		   }
              if(height==1){//防止高度为1的矩阵的越界
		    	   break;
		       }
		        i++;
		        j--; 
		        //System.out.println("j_:"+j);
		   while(flagMatrix[i][j]!=0){
			   //  System.out.println(matrix[i][j]);
			   list.add(matrix[i][j]);
			   flagMatrix[i][j]=0;
			   i++;	
			   count++;
			   if(i==height){
				   break;
			   }
		   }
             if(width==1){//防止宽度为1的矩阵的越界
	    	    break;
	         }
		       i--;
		       j--;
		   while(flagMatrix[i][j]!=0){
			   //  System.out.println(matrix[i][j]);
			   list.add(matrix[i][j]);
			   flagMatrix[i][j]=0;
			   j--;	
			   count++;
			   if(j<0){
				   break;
			   }
		   }
           
		   i--;
		   j++;
		   while(flagMatrix[i][j]!=0){
			   //  System.out.println(matrix[i][j]);
			   list.add(matrix[i][j]);
			   flagMatrix[i][j]=0;
			   i--;	
			   count++;
			   if(i<0){
				   break;
			   }
		   }
		   i++;
		   j++;
		}
		
		
		
		
		
		return list;   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值