二维数组(矩阵)对角线输出
程序员文章站
2022-04-07 14:47:39
...
今天在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
但是我觉得我的代码更易懂,更容易理解
上一篇: Technology Tree(第十五届浙江大学宁波理工学院程序设计大赛K)
下一篇: 二维数组