`

二维数组(矩阵)对角线输出

阅读更多

今天在BBS里面看到这样的面试题目,

 

1,二维数组(N*N),沿对角线方向,从右上角打印到左下角如N=4: 
4*4二维数组 

{ 1 2 3 4 }
{ 5 6 7 8 }
{ 9 10 11 12 }
{13 14 15 16 }


打印顺序 

4
3 8
2 7 12
1 6 11 16
5 10 15
9 14
13


要求半个小时内写出可完整运行的代码。 

 

 

 

我试着自己写了下

注:如果要copy代码玩,代码中用到了junit 和slf4j  自行导入

 

 

package common;

import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @version 1.0.7 2014年6月13日 下午8:41:24
 * @since 1.0.7
 */
public class TwoDimensionalArrayTest{

	private static final Logger	log	= LoggerFactory.getLogger(TwoDimensionalArrayTest.class);

	private Integer[][]			array;

	@Before
	public void init(){
		int i = 9;

		//**************构造二维数组************************************
		array = new Integer[i][i];

		for (int j = 0; j < i; ++j){
			array[j] = new Integer[i];

			for (int k = 0; k < i; ++k){
				array[j][k] = i * j + 1 + k;//由于值是从1 开始的,而循环的索引是从0开始的,固需要+1, 处理
			}
		}
	}

	@Test
	public final void test(){
		//总行数
		int rows = array.length;
		//第几行
		for (int row = 0; row < rows; ++row){
			//每一行循环 开始数字 索引列
			int columns = beginColumns(rows, row);

			//columns 列数
			for (int column = columns; column >= 0; --column){
				//以输出整行为出发点
				//row&column 定位 这行输出起始坐标点
				System.out.println(getCurrentLineString(rows, row, column));
			}
		}
	}

	/**
	 * 获得这行输出的结果
	 * 
	 * @param rows
	 *            总行数
	 * @param row
	 *            输出起始行
	 * @param column
	 *            输出起始列
	 * @return
	 */
	private StringBuilder getCurrentLineString(int rows,int row,int column){
		//-------------------------------------------------------------------
		//concatCount表示 当前这个数字 最大连接数字 个数
		int concatCount = (rows - row) - column;

		StringBuilder sb = new StringBuilder();
		//line控制当前行 输出数字的数量
		for (int line = 0; line < concatCount; ++line){
			sb.append(array[row + line][column + line]);
			if (line != concatCount - 1){//不是最后一行 添加个 ""
				sb.append(" ");
			}
		}
		//-------------------------------------------------------------------
		return sb;
	}

	/**
	 * 倒序开始迭代索引,第一行会从 i-1开始,其余行都会从0开始
	 * 
	 * @param i
	 * @param totalLine
	 * @return
	 */
	private int beginColumns(int i,int totalLine){
		//这一行可用循环倒序 索引
		//比如第一行是 i个
		//第二行到第i行都是0
		if (totalLine == 0){
			return i - 1;
		}
		return 0;
	}
}

 

 

结果 

 

9
8 18
7 17 27
6 16 26 36
5 15 25 35 45
4 14 24 34 44 54
3 13 23 33 43 53 63
2 12 22 32 42 52 62 72
1 11 21 31 41 51 61 71 81
10 20 30 40 50 60 70 80
19 29 39 49 59 69 79
28 38 48 58 68 78
37 47 57 67 77
46 56 66 76
55 65 75
64 74
73

 

 

写完,看了网友精彩的回复,相比较,他们的代码更加简单,

比如有的一层循环搞定 http://www.iteye.com/topic/1134016?page=3#2409864

有的两层循环搞定 http://bylijinnan.iteye.com/blog/2056301

 

但是我觉得我的代码更易懂,更容易理解

分享到:
评论

相关推荐

    C# 二维数组 矩阵

    C#中 二维数组,阵列,基本语法。 10-1. 陣列種類: 2 10-2. 陣列的宣告方式 2 10-3. 指定初值的陣列宣告方式 3 10-4. 陣列索引指標的上下界值 3 10-5. 比較VB.NET與C#.NET的陣列 4 10-6. 範例練習[exp10-1]:二維陣...

    C语言数组二

    总的来说,本实验通过三个具体的实例,深入地介绍了二维数组在实际问题中的应用,包括基本操作如初始化、输入输出,以及更复杂的数组处理技巧,如计算对角线和、构造特定的数形结构和矩阵操作。这些技能对于理解和...

    Java 求一个3*3矩阵对角线元素之和.rar

    Java 求一个3*3矩阵对角线元素之和,实现的思路主要是利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。也就计算对角线之和。计算对角线之和代码分享:  for(int i = 0;i ;i )  {   for(int j = 0;j ;j ...

    用二维数组实现杨辉三角

    1. **初始化**:将二维数组的第一列和主对角线元素设置为1,因为这些位置的值在任何情况下都是1。 2. **计算中间元素**:从第二行开始,使用嵌套循环计算每一行的内部元素。每一个元素的值等于其上方左侧和正上方两...

    c++二维数组ppt资源

    2.给定一个n*n的矩阵,求该矩阵中对角线上元素的和。 sum = 0; for (i = 0; i ; i++) sum += a[i][i]; cout ; 3.将一个n*m的矩阵行和列元素互换并输出。 for (i = 0; i ; i++) for (j = 0; j ; j++) cout [j]...

    Matlab三维数组操作大全(运行需更改文件名称)

    该资源给出了Matlab中关于三维数组的相关操作,包括:访问三维数组中的元素,取三维数组中每个二维矩阵的对角线元素,三维数组转置,对三维数组中每层的二维矩阵进行求和,对三维数组中每层的二维矩阵进行平均值计算...

    二维数组遍历

    第二种遍历方式是按照逆向对角线方向遍历二维数组,并且每遍历完一条对角线后,同时打印该对角线与其对称位置的另一条对角线上的元素。 ```c for (int i = 0; i ; i++) { int k = MAX - i - 1; for (int j = 0; j...

    c++实现求数组两对角线元素之和

    在C++编程中,"数组对角线元素之和"是一个常见的问题,特别是在处理二维数组时。本项目针对这个问题提供了一种解决方案,适用于VC6.0和VC2005两个版本的Microsoft Visual C++编译器。在这个场景中,我们要计算一个二...

    python实现二维数组的对角线遍历

    ### Python 实现二维数组的对角线遍历 在计算机科学中,二维数组是一种常见的数据结构,被广泛应用于各种算法和编程任务中。对于二维数组的遍历,除了常见的按行或按列遍历外,有时还需要进行特殊形式的遍历,比如...

    4*4矩阵对角线之和

    在4×4的矩阵中,主对角线上的元素是第1行第1列、第2行第2列、第3行第3列以及第4行第4列的元素。 #### 副对角线 副对角线是指从右上角到左下角的对角线。对于4×4的矩阵而言,副对角线上的元素为第1行第4列、第2行...

    基于C++编写一个函数求一个4*4二维数组所有周边元素的和

    在C++编程中,二维数组是一种非常常见的数据结构,它被广泛用于表示表格或矩阵。在本题中,我们被要求编写一个函数,该函数计算一个4x4二维数组的所有周边元素的和。周边元素指的是矩阵边缘上的元素,不包括对角线上...

    用二维数组实现魔方矩阵(含代码)

    【魔方矩阵】是一种特殊的矩阵,要求每行、每列以及两条主要对角线上的数字之和都相等。这种矩阵通常用于智力游戏和数学问题中。本篇文档将介绍如何使用二维数组来实现魔方矩阵,特别是针对奇数阶的魔方矩阵。 **...

    cpp代码-(二维数组)(1)随机数,赋值给二维数组(2)把主对角线副对角线的元素赋值给一维数组

    在本项目中,我们主要探讨的是使用C++编程语言处理二维数组的相关知识,特别是如何向二维数组填充随机数以及如何提取二维数组的主对角线和副对角线元素到一维数组中。以下是关于这些主题的详细说明: 首先,二维...

    实验七 二维数组

    1. **求一个3×3矩阵对角线元素之和**: 需要用到双重循环来遍历整个矩阵,然后根据对角线的特性(即行索引和列索引相等)来累加元素。 2. **打印杨辉三角形**: 使用双重循环,外层循环控制行数,内层循环控制...

    matrix二维数组变换.zip

    - 对角线翻转:也称为镜像翻转,它沿着主对角线(从左上到右下)进行翻转,使得原数组的每个元素与其对角线上的元素互换位置。 - 旋转:通常分为90度、180度和270度的旋转。对于90度旋转,数组的每一行变为新数组...

    C#二维数组(答案).docx

    任务109更进一层,需要生成一个4x4的二维数组并填充随机整数,再输出整个数组和对角线元素。生成随机数可以用`Random`类,如`new Random().Next(10, 100)`生成10到99的随机整数。对角线元素分为主对角线(从左上到...

    Java程序设计基础:二维数组基本操作.pptx

    掌握求二维数组正对角线元 素和的操作; 55 了解求二维数组最大值的元 素及下标的操作; 6 了解求二维数组所有和或所 有列的和的操作。 复习:二维数组元素引用 数据类型 数组名[行标][列标] //行标与列标都不能越界...

Global site tag (gtag.js) - Google Analytics