面试题20顺时针打印数组

/*题目描述,要注意边界问题
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
例如,如果输入如下矩阵:
		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.
思路:
开始坐标(start,start),循环继续的条件是rows>2*startX,column>2*startY
	第一行打印,从左往右;
	第二行打印,从上往下;
	第三行打印,从右往左;
	第四行打印,从下往上;
*/
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
		int rows,columns;
		int start=0,endX,endY;
		endX=matrix.size();
		endY=matrix[0].size();
		vector<int> result;

		while(!matrix.empty()&&(endX>2*start)&&(endY>2*start)){
			rows=endX-start-1;
			columns=endY-start-1;
			for (int i=start;i<=columns;++i)//打印第一行
				result.push_back(matrix[start][i]);

			if(rows>start){
				for(int i=start+1;i<=rows;++i)
					result.push_back(matrix[i][columns]);				

			}
			if(rows>start&&columns>start){
				for(int i=columns-1;i>=start;--i)
					result.push_back(matrix[rows][i]);

			}
			if(rows>start+1&&columns>start){
				for(int i=rows-1;i>=start+1;--i)
					result.push_back(matrix[i][start]);					

			}
		++start;
	   }

	return 	result;
	}
};

  

时间: 2024-10-11 21:17:55

面试题20顺时针打印数组的相关文章

《剑指offer》面试题20 顺时针打印矩阵 Java版

我的方法:遇到这种题最好在纸上画一画打印路线.我利用了4个标志left.top.right.bottom,表示当前需要打印的左界.上届.右界和下界,换句话说这些界线之外的已经打印了,如此一来判断结束的标准也很清晰,top>bottom或者left>right就表示已经没有需要打印的空间.和第14题中确定结束条件类似,明确下标的含义,就能很快判断结束条件. public void myPrint(int[][] a){ if(a == null || a.length == 0 || (a.le

【剑指offer】面试题 29. 顺时针打印矩阵

面试题 29. 顺时针打印矩阵 题目描述 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 解答过程 下图的矩阵顺时针打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 代码实现 import java.util.

剑指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. 分析:书上的变量有点多,看不大懂,这里借助了一个辅助数组,用来判定已经访问过的节点. package com.gjjun.jzoffer;import java.util.ArrayList; import java.ut

顺时针打印数组

[问题]输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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. [思路]这道题目需要我们学会如何设置变量,让程序更加好写一些,当我们通过设置上.下.左.右四个变量,可以很轻松的完成矩阵最外圈的打印,然后依次从外围向内打印!共需要四个打印过程!需要注意的是,当一个矩阵为列向量或者行向量又

20. 顺时针打印矩阵

http://ac.jobdu.com/problem.php?pid=1391 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 解析: 在解题前一定要有清晰的思路.应画图以明白思路,切勿直接写代码,因为本题条件多,直接写肯定会出现问题. 因为从外圈到内圈的打印,所以我们把

【剑指offer】题目20 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路: 关键注意①每一圈中四条边的边界,要每一次都打印到这一条边的末尾.右边的策略是错的,因为在只有一行一列时每一条边都判定该元素是下一条边的,导致错误.                       ②下面的边和左边

算法:顺时针打印数组

import java.util.*; public class Solution{ ArrayList<Integer> list = new ArrayList<>(); public ArrayList<Integer> printMatrix(int [][] matrix) { int rows = matrix.length; int columns = matrix[0].length; int start = 0; while(rows > sta

剑指Offer-顺时针打印数组

题目描述:输入一个数组(m*n维),要求从外向里顺时针打印数组的元素. #include <iostream> #include <stdio.h> using namespace std; void PrintMatrixInCircle(int **numbers,int rows,int columns,int start); void printNumber(int number); void PrintMatrixCircle(int **numbers,int rows

笔试算法题(26):顺时针打印矩阵 &amp; 求数组中数对差的最大值

出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左,下上),所以需要一个index变量控制每次循环时执行的打印模式: 注意水平打印和垂直打印分别需要两个变量控制打印元素,并且两组变量中的两个端点都是相互靠近的(hs和he,vs和he),每执行一种打印模式之前,需要更新当前打印模式中打印方向的其实坐标,因为它已经在上一种打印模式中打印过: 每一种打印模