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

	public void myPrint(int[][] a){
if(a == null || a.length == 0 || (a.length == 1 && a[0].length == 0)){
return;
}
int left = 0;
int right = a[0].length -1;
int top = 0;
int bottom = a.length - 1;
//用于改变方向,分别代表 从左向右打印,从上往下打印,从又往左打印,从下往上打印。
int[] orientations = new int[]{0, 1, 2, 3};
int count = 0;
while(left <= right && top <= bottom){
//按顺序改变方向
switch (orientations[count%orientations.length]) {
case 0:
//从左向右打印一行,打印完后上界下移
for(int i=left; i<=right; i++){
System.out.print(a[top][i]);
}
top++;
count++;
break;
case 1:
//从上到下打印一列,打印完后右界左移
for(int i=top; i<=bottom; i++){
System.out.print(a[i][right]);
}
right--;
count++;
break;
case 2:
//从右到左打印一行,打印完后下界上移
for(int i=right; i>=left; i--){
System.out.print(a[bottom][i]);
}
bottom--;
count++;
break;
case 3:
//从下到上打印一列,打印完后左界右移
for(int i=bottom; i>=top; i--){
System.out.print(a[i][left]);
}
left++;
count++;
break;
default:
break;
}
}
}

书中方法:书中的思路是一圈一圈向内打印,既然这样就要找到每一圈的起点和打印的圈。假设我们用count表示已经打印的圈数。起点就是(count, count);打印的圈是一个矩形条框,矩形可以由一条对角线确定,我们找到矩形条框右下角的点,就能由这个点和起点确定一个需要打印的圈(矩形框)。只要有起点的空间,就继续打印

	public void myPrint2(int[][] a){
if(a == null || a.length == 0 || (a.length == 1 && a[0].length == 0)){
return;
}
int count = 0;
//打印了count次后,如果还留有下一次打印的起始点的位置,继续打印
while(a.length - 2*count > 0 && a[0].length - 2*count > 0){
printRound(a, count);
count++;
}
}

打印的范围确定了,剩下就是按顺时针打印每一个圈。

	private void printRound(int[][] a, int count){
int endX = a[0].length - 1 - count;
int endY = a.length - 1 - count;
int start = count;
//无论如何第一行都需要打印
for(int i=start; i<=endX; i++){
System.out.print(a[start][i]);
}
//如果不止一行
if(start < endY){
for(int i=start+1; i<=endY; i++){
System.out.print(a[i][endX]);
}
}
if(start < endX && start < endY){
for(int i=endX-1; i>=start; i--){
System.out.print(a[endY][i]);
}
}
if(start < endX && start < endY-1){
for(int i=endY-1; i>start; i--){
System.out.print(a[i][start]);
}
}
}

《剑指offer》面试题20 顺时针打印矩阵 Java版的更多相关文章

  1. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  2. 剑指 offer面试题20 顺时针打印矩阵

    [题目描述] 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

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

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1   2   3  4 5   6   7  8 9  10 11 12 13 14 15 16 则依次打印出 ...

  4. 剑指Offer - 九度1391 - 顺时针打印矩阵

    剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...

  5. 剑指offer十九之顺时针打印矩阵

    一.题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  6. 剑指offer(19)顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  7. 【剑指Offer】19、顺时针打印矩阵

      题目描述:   输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依 ...

  8. 牛客网剑指offer第19题——顺时针打印矩阵

    这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  9. 剑指Offer——回溯算法解迷宫问题(java版)

    剑指Offer--回溯算法解迷宫问题(java版)   以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路.   下面我们来详细讲一 ...

随机推荐

  1. CF1151F Sonya and Informatics (计数dp+矩阵优化)

    题目地址 Solution (duyi是我们的红太阳) (这里说一句:这题看上去是一个概率dp,鉴于这题的概率dp写法看上去不好写,我们其实可以写一个计数dp) 首先拿到这个题目我们要能设出一个普通d ...

  2. 【C】题解 (五校联考3day2)

    分析 这道题看上去很恶心,实际上只用记录四坨东西就能打DP了:y坐标最小的向上射的点.y坐标最大的向下射的点.y坐标最大和最小的向右射的点,转移显然.注意,如果该状态的值为零就可以略过,否则会超时. ...

  3. Mybatis foreach批量插入

    1.foreach的属性 item:集合中元素迭代时的别名,必填 index:在list和array中,index是元素的序号:在map中,index是元素的key,可选 open:foreach代码 ...

  4. vue-cli3热更新配置,解决热更新失败的问题,保存代码浏览器自动刷新

    在vue,config.js中配置css热更新 const IS_PROD = ['production', 'test'].includes(process.env.NODE_ENV) css: { ...

  5. A Network in a Laptop: Rapid Prototyping for Software-Defined Networks

    文章名称:A Network in a Laptop: Rapid Prototyping for  Software-Defined Networks 文章来源:Lantz B , Heller B ...

  6. JavaSE知识点:finalize,treeMap

    *)finalize finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. *)treeMap 参考 ...

  7. IDEA中代码不小心删除,或者改了半天想回退到某个特定时间怎么办?

    第一步: 第二步: 第三步: 第四步:

  8. 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)

    北风设计模式课程---里氏替换原则(Liskov Substitution Principle) 一.总结 一句话总结: 当衍生类能够完全替代它们的基类时:(Liskov Substitution P ...

  9. LuceneNET全文检索封装

    一.源码特点       1.  Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎 ...

  10. MySQL删除外键约束问题

    当我们在一个表中添加字段约束的时候: ALTER TABLE product ADD CONSTRAINT product_fk FOREIGN KEY(category_id) REFERENCES ...