今天在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; /** * * @author <a href="mailto:venusdrogon@163.com">feilong</a> * @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
但是我觉得我的代码更易懂,更容易理解