JAVA编程题-求矩阵螺旋值

螺旋类

java 复制代码
package entity;
/**
 * 打印数组螺旋值类
 */
public class Spiral {
//	数组行
	private int row;
//	数组列
	private int col;
//	行列数
	private int size;
//	当前行索引
	private int rowIndex;
//	当前列索引
	private int colIndex;
//	行开始索引
	private int rowStart;
//	行结束索引
	private int rowEnd;
//	列开始索引
	private int colStart;
//	列结束索引
	private int colEnd;
//	数组
	private int[][] spiralArray;
//	保存数组
	private int[][] saveArray;
//	构造方法
	public Spiral(int row,int col,int[][] spiralArray) {
		this.row = row;
		this.col = col;
		this.rowStart = 0;
		this.rowEnd = row - 1;
		this.colStart = 0;
		this.colEnd = col - 1;
		this.size = row*col;
		this.spiralArray = spiralArray;
		this.saveArray = new int[row][col];
		for(int[] r : this.saveArray) {
			for(int i=0;i<r.length;i++) {
				r[i] = Integer.MIN_VALUE;
			}
		}
	}
//	打印螺旋值
	public void printSpiral() {
//		行列1时打印螺旋值
		if(this.row==1||this.col==1) {
			printArray();
			return;
		}
		while(size-->0) {
			printData();
			saveData();
			setRange();
			if(this.rowIndex==this.rowStart&&this.colIndex<this.colEnd) {
				toRight();
			}else if(this.rowIndex<this.rowEnd&&this.colIndex==this.colEnd) {
				toDown();
			}else if(this.rowIndex==this.rowEnd&&this.colIndex>this.colStart) {
				toLeft();
			}else if(this.rowIndex>this.rowStart&&this.colIndex==this.colStart) {
				toUp();
			}
		}
	}
//	设置行列开始结束值
	private void setRange() {
//		开始结束值的界分
		int rowDivide = this.row/2;
		int colDivide = this.col/2;
//		判断一行每个元素是否都走完
		for(int i=0;i<this.row;i++) {
			int colCount = 0;
			int[] r = this.saveArray[i];
			for(int j=0;j<this.col;j++) {
				int c = r[j];
				if(c!=Integer.MIN_VALUE) {
					++colCount;
				}
			}
			if(colCount==this.col) {
				if(i+1<rowDivide) this.rowStart = i + 1;
				if(i-1>=rowDivide) this.rowEnd = i - 1;
			}
		}
//		判断列元素是否走完
		for(int i=0;i<this.col;i++) {
			int rowCount = 0;
			for(int j=0;j<this.row;j++) {
				int data = this.saveArray[j][i];
				if(data!=Integer.MIN_VALUE) {
					++rowCount;
				}
			}
			if(rowCount==this.row) {
				if(i+1<colDivide) this.colStart = i + 1;
				if(i-1>=colDivide) this.colEnd = i - 1;
			}
		}
	}
	
	//	打印数组
	private void printArray() {
		for(int[] arr : this.spiralArray) {
			for(int data : arr) {
				System.out.print(data);
			}
		}
	}
//	打印元素
	private void printData() {
		System.out.print(this.spiralArray[this.rowIndex][this.colIndex]);
	}
//	向上移动
	private void toUp() {
		this.rowIndex = (this.rowIndex-1)>=0?--this.rowIndex:0;
	}
//	向下移动
	private void toDown() {
		this.rowIndex = (this.rowIndex+1)<this.row?++this.rowIndex:this.row-1;
	}
//	向左移动
	private void toLeft() {
		this.colIndex = (this.colIndex-1)>=0?--this.colIndex:0;
	}
//	向右移动
	private void toRight() {
		this.colIndex = (this.colIndex+1)<this.col?++this.colIndex:this.col-1;
	}
//	保存已经过数据
	private void saveData() {
		this.saveArray[this.rowIndex][this.colIndex] = this.spiralArray[this.rowIndex][this.colIndex];
	}
}

测试类

java 复制代码
package test;

import java.util.Arrays;

import entity.Spiral;

public class SpiralTest {

	public static void main(String[] args) {
//		int row = 1;
//		int col = 1;
//		int[][] array = {{1}};
//		int row = 1;
//		int col = 2;
//		int[][] array = {{1,2}};
//		int row = 2;
//		int col = 1;
//		int[][] array = {{1},{2}};
		int row = 4;
		int col = 5;
		int[][] array = new int[row][col];
		for(int[] r : array) {
			for(int i=0;i<r.length;i++) {
				r[i] = (int)(Math.random()*100);
			}
		}
		System.out.println(Arrays.deepToString(array));
		Spiral sp = new Spiral(row,col,array);
		sp.printSpiral();
	}

}
相关推荐
风_流沙4 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
Lenyiin15 分钟前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿31 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd31 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
ProtonBase34 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
Watermelo61735 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v40 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人2 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法