当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

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

发表于: 2014-06-13   作者:飞天奔月   来源:转载   浏览:
摘要: 今天在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 要

今天在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

 

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

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1. /* 2. * Copyright (c) 2012, 烟台大学计算机学院 3. * All rights reserved. 4. * 作 者: 吕建
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生
【任务4】建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入
上篇讲了一维的连续子数组和的最大值(编程之美错误分析),下面来分析二维数组的最大子数组和,亦
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14489 Accepted: 6735
今天看完了数组,在做课后题的时候发现有这么一道题,让求出一个3x3矩阵对角线元素相加的问题,在网上
题目要求:(3月17号课堂练习的延伸) 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是
一、题目要求 1.1输入一个二维整形数组,数组里有正数也有负数。 1.2二维数组首尾相接,象个一条首
1.声明 类型说明符 数组名[][] / [][]数组名; example:int a[][]; 2.初始化 数组名=new 类型说明
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号