顺时针打印数组

题意

例如我们有一个二维数组,如下

  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.niuke;

import java.util.ArrayList;

/**
* Created by puyangsky on 17/3/11.
* 顺时针打印数组
* 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
*/
public class PrintMatrix {
public static ArrayList<Integer> printMatrix(int [][] matrix) {
int h = matrix.length;
int l = matrix[0].length;
ArrayList<Integer> ans = new ArrayList<Integer>();
if (h==0 || l==0) return ans;
int left_right = 0;
int top_down = 0;
int right_left = l-1;
int down_top = h-1;
while (left_right <= right_left && top_down <= down_top) {
//从左至右打印
for (int i = left_right; i <= right_left; i++) ans.add(matrix[top_down][i]); //从上至下打印
for (int i = top_down+1; i <= down_top; i++) ans.add(matrix[i][right_left]); //从右至左打印
if(top_down < down_top) {
for (int i = right_left-1; i >= left_right; i--) ans.add(matrix[down_top][i]);
} //从下至上打印
if(right_left > left_right) {
for (int i = down_top-1; i >= top_down+1; i--) ans.add(matrix[i][left_right]);
}
//更新四个下标的值
down_top--;left_right++;right_left--;top_down++;
} return ans;
} public static void main(String[] args) {
int[][] matrix = {
{1,2},
{3,4},
{5,6},
{7,8},
{9,10}
}; ArrayList<Integer> ans = new ArrayList<Integer>(); ans = printMatrix(matrix); for(int i : ans)
System.out.printf("%d\t", i);
}
}

结果

1 2 4 6 8 10 9 7 5 3

【剑指offer】顺时针打印数组的更多相关文章

  1. 用js刷剑指offer(顺时针打印数组)

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

  2. 剑指offer - 顺时针打印矩阵 - JavaScript

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

  3. 剑指OFFER——顺时针打印矩阵

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

  4. 剑指Offer顺时针打印矩阵

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

  5. 剑指Offer 顺时针打印矩阵

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

  6. python剑指offer 顺时针打印指针

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

  7. 剑指Offer:把数组排成最小的数【45】

    剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3 ...

  8. 力扣 - 剑指 Offer 17. 打印从1到最大的n位数

    题目 剑指 Offer 17. 打印从1到最大的n位数 思路1 如果有n位,那么最大值就是\(10^n-1\),即如果n是2,那么最大就到输出到99 考虑到大数情况,所以使用字符数组 还要把字符数组转 ...

  9. 【剑指Offer】把数组排成最小的数 解题报告(Python)

    [剑指Offer]把数组排成最小的数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  10. 剑指offer:调整数组顺序使奇数位于偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

随机推荐

  1. [Luogu 1963] NOI2009 变换序列

    [Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...

  2. 删除windows上特定目录下以*.rar后缀名的python脚本

    import os,fnmatch,datetime,time def all_files(root,pattern='*',single_level=False,yield_folders=Fals ...

  3. JS中的实例方法与静态方法

    一.静态方法与实例方法的例子: 我们先来看一个例子来看一下JS中的静态方法和实例方法到底是什么 静态方法: function A(){} A.sayMeS=function(){ console.lo ...

  4. 各浏览器的Hack写法【转】

    Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack.然后将Hack ...

  5. 如何创建和销毁对象(Effective Java 第二章)

    最近有在看Effective Java,特此记录下自己所体会到的东西,写篇博文会更加的加深印象,如有理解有误的地方,希望不吝赐教. 这章主题主要是介绍:何时以及如何创建对象,何时以及如何避免创建对象, ...

  6. 哈希表(一):解决hash冲突的几种方法

    (一)线性探测法 线性探测法是最简单的处理冲突的方法. (1)插入元素:插入元素时,如果发生冲突,算法将从该槽位向后遍历哈希表,直到找到表中的下一个空槽,并将该值放入到空槽当中. (2)查找元素:查找 ...

  7. handle_level_irq 与handle_edge_irq 的区别【转】

    转自:http://blog.csdn.net/xavierxiao/article/details/6087277 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux 里, handl ...

  8. 【bzoj3223】文艺平衡树

    #include<bits/stdc++.h> #define N 300005 #define rat 4 using namespace std; struct Node{ int s ...

  9. SQL中char、nchar、varchar、nvarchar、text概述【转】

    1. char char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. 2. nchar ...

  10. JavaScript中创建对象的5种模式

    构造函数模式 实现方式: function Person(name, age, job) { this.name = name; this.age = age; this.job = job; thi ...