`
MouseLearnJava
  • 浏览: 460562 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

连续数字的旋转二维数组

    博客分类:
  • Java
阅读更多
生成一个连续数字的旋转二维数组,起始位置位于左上角,然后从起始位置开始递增,按照顺时针或者逆时针从外向里将连续的数组存入二维数组中,并输出生成的旋转二维数组。

/**
 * 
 * <code>ConvolutionalArray</code>主要是用来输出一个旋转式样的二维数组。
 * 
 * 
 * 此二维数组由连续的数字组成,比如:
 *  * 
 * int i=5;   
 * 1  2  3  4  5  
 * 16 17 18 19 6  
 * 15 24 25 20 7  
 * 14 23 22 21 8  
 * 13 12 11 10 9  
 
 * int i=6  
 * 1  2  3  4  5   6  
 * 20 21 22 23 24  7  
 * 19 32 33 34 25  8  
 * 18 31 36 35 26  9  
 * 17 30 29 28 27 10  
 * 16 15 14 13 12 11  
 * 

 * 
 * @author Eric
 * @version 1.0
 * 
 */

public class ConvolutionalArray {

	private static final int DEFAULT_NUMBER = 5;

	// 定义连续数字添加的方向
	private enum Direction {
		Right, Down, Left, Up;
	}

	// 保存当前处理的方向,默认一开始是向右的。
	private Direction currentDirection = Direction.Right;

	// 将一个二维数组看成X, Y两个方向,记录下,最小的X,Y值以及最大的X,Y
	private int minX = 0;

	private int minY = 0;

	private int maxX = DEFAULT_NUMBER - 1;

	private int maxY = DEFAULT_NUMBER - 1;

	private int currentCount = 0;

	/**
	 * 打印数组。
	 * 
	 * @param expectedNumber :
	 *            期望的二维数组每行显示的个数。
	 */
	public void printArray(int expectedNumber) {
		int[][] array = buildArray(expectedNumber);
		printArray(array, expectedNumber);
	}

	/**
	 * 
	 * @param expectedNumber:
	 *            期望的二维数组每行显示的个数。
	 * @return: 返回一个连续数字组成的二维数组。
	 */
	private int[][] buildArray(int expectedNumber) {
		int[][] result = new int[expectedNumber][expectedNumber];
		// Total number of numeric values
		int count = expectedNumber * expectedNumber;
		// Reset max value for maxX and maxY.
		maxY = expectedNumber - 1;
		maxX = expectedNumber - 1;
		/*
		 * 如果要生成一个nxn的二维数组,那么里面的最大数应该是n*n, 当处理的数字还没有达到这个最大值,一直循环处理下去。
		 * 
		 */
		while (currentCount < count) {
			/*
			 * 因为开始默认的方向是Right,也就是顺时针方向,所以,处理的顺序是 Right -> Down -> Left -> Up
			 * ->Right ... 每次一个方向填充值之后,需要先判断当前数据是否达到最大值。
			 */
			if (currentCount < count) {
				processRight(result);
			}
			if (currentCount < count) {
				processDown(result);
			}
			if (currentCount < count) {
				processLeft(result);
			}
			if (currentCount < count) {
				processUp(result);
			}
		}
		return result;
	}

	/**
	 * 向右方向填充数据。
	 */
	private void processRight(int[][] currentArray) {
		for (int i = minX; i <= maxX; i++) {
			currentArray[minY][i] = ++currentCount;
		}
		changeDirection();
		minY++;
	}

	/**
	 * 向下方向填充数据。
	 */
	private void processDown(int[][] currentArray) {
		for (int i = minY; i <= maxY; i++) {
			currentArray[i][maxX] = ++currentCount;
		}
		changeDirection();
		maxX--;
	}

	/**
	 * 向左方向填充数据。
	 */
	private void processLeft(int[][] currentArray) {
		for (int i = maxX; i >= minX; i--) {
			currentArray[maxY][i] = ++currentCount;
		}
		changeDirection();
		maxY--;
	}

	/**
	 * 向上方向填充数据。
	 */
	private void processUp(int[][] currentArray) {
		for (int i = maxY; i >= minY; i--) {
			currentArray[i][minX] = ++currentCount;
		}
		changeDirection();
		minX++;
	}

	/**
	 * 打印二维数组的内容。
	 * 
	 * @param array
	 * @param expectedNumber
	 */
	private void printArray(int[][] array, int expectedNumber) {
		for (int i = 0; i < expectedNumber; i++) {
			for (int j = 0; j < expectedNumber; j++) {
				System.out.print(appendSpace(array[i][j], expectedNumber));
			}
			System.out.println();
		}
	}

	/**
	 * 为了保证数据输出时能够对齐,添加一些空格.
	 */
	private String appendSpace(int value, int expectedNumber) {
		int maxValue = expectedNumber * expectedNumber;
		int maxLength = String.valueOf(maxValue).length();
		int currentValueLength = String.valueOf(value).length();
		StringBuilder sb = new StringBuilder();
		sb.append(value);
		for (int i = maxLength; i > currentValueLength; i--) {
			sb.append(" ");
		}
		sb.append(" ");
		return sb.toString();
	}

	/**
	 * 改变当前的方向。
	 */
	private void changeDirection() {
		switch (currentDirection) {
		case Right:
			currentDirection = Direction.Down;
			break;
		case Down:
			currentDirection = Direction.Left;
			break;
		case Left:
			currentDirection = Direction.Up;
			break;
		case Up:
			currentDirection = Direction.Right;
			break;
		}
	}

	/**
	  * 在一个二维数组基础上,以对角线为对称线,实现两侧数据的交换,并返回这个交换数据后的二维数组。
	  * 
	  * 这样做有一个用处:比如已经有一个向右的二维旋转数组(向右):
	  *  
	  1  2  3  4  
	  12 13 14 5  
	  11 16 15 6  
	  10 9  8  7  
	  采用此方法之后,可以得到一个向下方向的二维旋转数组(向下)
	  1  12 11 10 
	  2  13 16 9  
	  3  14 15 8  
	  4  5  6  7  
	  */
	private int[][] exchangeArray(int[][] originalArray, int expectedNumber) {
		int[][] exchangedArray = new int[expectedNumber][expectedNumber];
		for (int i = 0; i < expectedNumber; i++) {
			for (int j = 0; j < expectedNumber; j++) {
				exchangedArray[i][j] = originalArray[j][i];
			}
		}
		return exchangedArray;
	}

	/**
	 * 打印交换数据后的二维数组。
	 */
	public void printExchangedArray(int expectedNumber) {
		int[][] array = buildArray(expectedNumber);
		printArray(exchangeArray(array, expectedNumber), expectedNumber);
	}
}


测试代码:

public class Test {
	public static void main(String[] args) {
		for (int i = 5; i < 11; i++) {
			System.out.println("Direction: Right; int = " + i);
			new ConvolutionalArray().printArray(i);
			System.out.println();
			System.out.println("Direction: Down; int = " + i);
			new ConvolutionalArray().printExchangedArray(i);
			System.out.println();
		}
	}
}


输出结果:








下面在显示一个大小为34*34的旋转二维数组:




  • 大小: 30.7 KB
  • 大小: 37.2 KB
  • 大小: 39.5 KB
  • 大小: 248 KB
  • 大小: 248.2 KB
0
6
分享到:
评论

相关推荐

    leetcode二维数组-programming_exercises:leetcode、nowcoder刷题之路

    leetcode二维数组 编程练习 包含常见的编程网站的练习习题(leetcode、牛客等)----待完成中... 也同时包含复习面试的编程练习 该src/main/java目录下,以文件夹命名,表示的是不同的来源 每个文件均可单独运行 其他...

    (一)剑指offer—Python版—数组篇

    二维数组中的查找6.旋转数组中的最小值11.调整数组使奇数位于偶数前面19.顺时针打印矩阵28.数组中出现次数超过一半的数字30.连续子数组最大和32.把数组排出最小的数35.数组中的逆序对37.数字在排序数组中出现的次数...

    各种经典的LabVIEW实例(50个).rar

    读取二维数组所有数据 调用C-动态数据库 贪食蛇 这个程序演示利用队列来实现数据的传引用 远程开启VI 连续写入文件 键盘控制TAB控件 黑白棋程序 Excel相关 Google_Earth和LV labview8.6如你所愿 labview8.6自动连接...

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典

    二维数组中查找目标值、4.替换字符串中的空格。5.从尾到头打印链表.6.由前序和中序遍历重建二叉树.7.用两个栈实现队列8.求旋转数组的最小数字、9.斐波那契数列的第n项(青蛙跳台阶)10.二进制中1的个数、11.数值的整数...

    《剑指Offer》题目及代码.zip

    3. 二维数组中查找目标值 4. 替换字符串中的空格 5. 从尾到头打印链表 6. 由前序和中序遍历重建二叉树 7. 用两个栈实现队列 8. 求旋转数组的最小数字 9. 斐波那契数列的第n项(青蛙跳台阶) 10. 二进制中1的...

    Coding-Interviews:Coding-Interviews(剑指offer代码)

    Interviews(剑指offer Java代码)二维数组中的查找替换空格从尾到头打印链表重建二叉树用两个栈实现队列旋转数组的最小数字斐波那契数列跳台阶变态跳台阶矩形覆盖二进制中1的个数数值的整数次方调整数组顺序使奇数...

    LeetCode解题总结

    7.3 在二维排序数组中查找给定值 7.4 在旋转有序数组中查找最小值 7.4.1 数组无重复 7.4.2 数组有重复 7.5 在旋转排序数组中查找指定数字 8. 暴力枚举法 8.1 求集合的子集 8.2 集合的全排列 8.3 在指定树中选择进行...

    判断链表是否为回文链表leetcode-Algorithms:Coding_Interviews和Leetcode

    二维数组中的查找 从尾到头打印链表 重建二叉树(用前序和中序构建) 从上到下打印二叉树(层序遍历) 用两个栈实现队列 斐波那契数列 旋转数组的最小数字 矩阵中的路径 数值的整数次方 打印从1到最大的n位数 二进制中...

    leetcode答案-Leetcode:LeetCode上的剑指offer题目;将它们分为十类,如下所示。并且有js编程语言的答案

    二维数组中的查找 2、05. 替换空格 3、11. 旋转数组的最小数字 4、17. 打印从1到最大的n位数 5、21. 调整数组顺序使奇数位于偶数前面 6、29. 顺时针打印矩阵 7、39. 数组中出现次数超过一半的数字 8、57. 和为s的两...

    《Excel应用大全》示例文件 光盘文件

    • 使用两个一维数组构造二维数组 • 部门评价等级转换 • 使用MMULT 函数计算产品结构指数 • 产生1-10 的自然数垂直序列和水平序列 • 等比例构造一维循环数组 • SUMIF函数对产品产量进行逐行汇总 • 利用MMULT...

    leetcode分类-nowcoder:牛客网学习,包括剑指offer,程序员面试金典,leetcode,公司模拟真题,数据结构等

    03二维数组中的查找 04替换空格 05从尾到头打印链表 06重建二叉树 07用两个栈实现队列 08旋转数组的最小数字 09斐波那契数列 09跳台阶 09变态跳台阶 09矩阵覆盖 10二进制中1的个数 11数值的整数次方 14调整数组顺序...

    丢失的最小正整数leetcode-Java_DataStructure:Java的数据结构和算法的学习

    1、二维数组的查找 2、替换空格 3、从尾到头打印链表 4、重建二叉树 5、用两个栈实现队列 6、旋转数组的最小数字 7、斐波那契数列 8、跳台阶 9、变态跳台阶 10、矩形覆盖 11、二进制中1的个数 12、数值的整数次方 13...

    leetcode2sumc-CipherSchools_Assignment:ciphershcoll和讲座代码的所有分配

    按行和按列排序的二维数组中的第 K 个最小元素 | 设置 1(硬) 最大和连续子阵列(中) 铁路/汽车站所需的最少站台数量(中) 找到丢失的数字(简单) 合并两个已排序的数组(简单) 在已排序和旋转的数组中搜索元素...

    MATLAB图形图像处理

    2.1 二维绘图 2.1.1 基本绘图函数 2.1.2 图形窗口的修饰 2.2 三维绘图 2.2.1 plot3 函数 2.2.2 三维网格图和曲面图 第三章 MATLAB 图形对象 3.1 图形对象 3.1.1 Root 对象 3.1.2 Figure 对象 3.1.3 ...

    matlab6.5图形图像处理源程序

    2.1 二维绘图 2.1.1 基本绘图函数 2.1.2 图形窗口的修饰 2.2 三维绘图 2.2.1 plot3 函数 2.2.2 三维网格图和曲面图 第三章 MATLAB 图形对象 3.1 图形对象 3.1.1 Root 对象 3.1.2 Figure 对象 3.1.3 ...

    matlab6.5图形图象处理源程序

    2.1 二维绘图 2.1.1 基本绘图函数 2.1.2 图形窗口的修饰 2.2 三维绘图 2.2.1 plot3 函数 2.2.2 三维网格图和曲面图 第三章 MATLAB 图形对象 3.1 图形对象 3.1.1 Root 对象 3.1.2 Figure 对象 3.1.3 ...

    VC++ matlab图像处理

    2.1 二维绘图 2.1.1 基本绘图函数 2.1.2 图形窗口的修饰 2.2 三维绘图 2.2.1 plot3 函数 2.2.2 三维网格图和曲面图 第三章 MATLAB 图形对象 3.1 图形对象 3.1.1 Root 对象 3.1.2 Figure 对象 3.1.3 ...

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar

    10.2.3 二维离散傅立叶变换( 2DDFT ) 10.2.4 快速傅立叶变换( FFT ) 10.2.5 傅立叶变换的研究与应用 10.3 离散余弦变换 10.3.1 DCT 变换矩阵 10.3.2 dct2 函数和 dctmtx 函数 10.4 Walsh- Hadamard ...

    Image-Processing:该项目是在SRA分配,图像处理任务下完成的

    卷积提供了一种将两个通常大小不同但维数相同的数字数组相乘以产生相同维数的第三数组的方法。核形成了第二矩阵,为图像提供了效果。 应用5X5滤镜执行以下任务模糊化锐化 输入图像输出 方块模糊高斯模糊锐化3.边缘...

Global site tag (gtag.js) - Google Analytics