转圈打印数组问题

1.给定一个整形矩阵matrix,请按照转圈的方式打印它。

例如:

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

要求额外空间复杂度为:O(1)

解答:

本题主要介绍一种矩阵处理方式,该方式不仅可用于这道题,还适合很多其他的面试题,就是矩阵分圈处理。在矩阵中用左上角的tr,tc和右下角的dr,dc就可以表示一个子矩阵,比如题目中的矩阵,当(tr,tc)=(0,0),(dr,dc)=(3,3)时,表示的矩阵就是整个矩阵,那么这个子矩阵的最外层部分如下:

1   2   3   4

5             8

9            12

13 14 15 16

如果能把这个子矩阵的外层转圈打印出来,那么在(tr,tc)=(0,0),(dr,dc)=(3,3)时,打印结果为:1 2 3 4 8 12 16 15 14 13 9 5。接下来令tr和tc加1,即(tr,tc)=(1,1),令dr,dc减1,即(dr,dc)=(2,2),此时表示的子矩阵为:

6  7

10 11

在把这个矩阵打印出来,结果为:6 7 11 10。把tr,tc加1,即(tr,tc)=(2,2),令dr,dc减1,即(dr,dc)=(1,1)。发现左上角坐标跑到了右下角坐标的右方或者下方,整个过程就停止。已经打印的结果就是我们要求的结果。具体代码参考如下:

 1 public void  spiralOrderPrint(int[][] matrix)
 2 {
 3     int tr=0;
 4     int  tc=0;
 5     int dr=matrix.lenth-1;
 6     int  dc=matrix[0].length-1;
 7    whiel(tr<=dr && tc<=dc)
 8   {
 9       printEdge(matrix,tr++,tc++,dr--,dc--);
10
11    }
12 }
13
14  public void   printEdge(int[][] matrix,int tr,int tc,int dr,int dc)
15  {
16     if(tr==dr)
17   {
18      for(int i=tc;i<=dc;i++)
19          System.out.print(m[tr][i]+" ");
20   }
21  else if(tc==dc)
22  {
23     for(int i=tr;i<=dr;i++)
24          System.out.print(m[i][tc]+" ");
25    }
26  }else
27 {
28     int curc=tc;
29     int curr=tr;
30     while(curc!=dc)
31    {
32        System.out.print(m[tr][curc]+" ");
33        curc++;
34     }
35   while(curr!=dr)
36  {
37        System.out.print(m[curr][dc]+" ");
38        curr++;
39   }
40  while(curc!=tc)
41    {
42        System.out.print(m[dr][curc]+" ");
43        curc--;
44     }
45   while(curr!=tr)
46  {
47        System.out.print(m[curr][tc]+" ");
48        curr--;
49   }
50 }

时间: 2024-10-28 13:43:35

转圈打印数组问题的相关文章

数组和矩阵的问题转圈打印数组

package demo2; import java.util.Scanner; public class Main { private static Scanner input = new Scanner(System.in); public static void main(String[] args) { //1:首先初始化一个矩阵 //2:打印这个矩阵中的值 printMatrix(init(4,4)); } public static int [][] init(int row,int

算法初级面试题03——队列实现栈、栈实现队列、转圈打印矩阵、旋转矩阵、反转链表、之字打印矩阵、排序矩阵中找数

第一部分主要讨论:栈.队列.数组矩阵相关的面试题 题目一 用数组结构实现大小固定的队列和栈 public static class ArrayStack { private Integer[] arr; private Integer size; public ArrayStack(int initSize) { if (initSize < 0) { throw new IllegalArgumentException("The init size is less than 0"

问答项目---封装打印数组的方法

封装格式化打印数组的方法: /* 格式化打印出数组 */ function p($arr){ echo "<pre>"; var_dump($arr); echo "</pre>"; } function pd($arr){ echo "<pre>"; var_dump($arr);die(); echo "</pre>"; }

PHP数组输出三种形式 PHP打印数组

PHP数组输出三种形式 PHP打印数组 $bbbb=array("11"=>"aaa","22"=>"bbb");//方式一:只能输出值value不能输出keyforeach($bbbb as $color)echo $color; //方法二:value与key都可输出foreach($bbbb as $key=>$value)echo $key."=>".$value; //方法

Java基础知识强化105:打印数组的方法总结

1. 使用for循环打印数组. 2. 使用Arrays工具类,将数组转化为有序的List打印出来. 3. 使用Arrays工具类,使用Arrays.toString()输出数组内容. 上面三种方法打印数组的示例代码如下: package com.himi.printarray; import java.util.Arrays; public class AnormalArray { public static void main(String[] args) { /** * 使用for循环打印数

循环打印数组,并统计个数shell脚本

使用Shell循环打印数组 [[email protected] array]# cat a.sh #!/bin/bash array=( freddy freddie tang sheng wei ) for ((i=0;i<${#array[@]};i++));do echo "This is num $i,then content is ${array[$i]}" #$i是下标 done echo "-----------------" echo &qu

9.10扩展性与存储限制(三)——若只有4KB内存可用,该如何打印数组中所有重复的元素

/** * 功能:给定一个数组,包含1到N的整数,N最大为32000,数组可能含有重复的值,且N的取值不定. * 若只有4KB内存可用,该如何打印数组中所有重复的元素. */ /** * 思路:4KB最多殉职8*4*2^10个比特.比32000大.创建含有32000个比特的位向量,其中每个比特代表一个整数. * 遇到重复元素,打印出来. * @param array */ public static void checkDuplicates(int[] array){ BitSet bs=new

剑指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

打印数组所有排列 python

本人.net一名,最近在看数据结构与算法分析,中间涉及的一些比较有意思的算法题,打算用python实现以下.选择python的原因,就是想熟悉一下python的语法,和pycharm基本的应用. 本篇,算法为:打印数组的所有排列可能.废话不多说,直接上代码. 1 #自动生成list 2 def creataList(n): 3 numlist=[]; 4 for i in range(n): 5 numlist.append(i); 6 7 return numlist; 8 #copy lis