A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhaoyar 中级黑马   /  2016-7-26 10:50  /  541 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;

import java.util.Scanner;

/**
* 7、写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:

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

* @author hasee
*/
/**
* 思路:1.等长的二维数组,最大色数据是n*n
*           2.先打印最外面一圈
*           3.根据i,j变化,进入第二圈,依次循环
* 编程过程:按照以上思路,先将最外层添加完毕,再修改每行,每列的截至条件
* @author hasee
*
*/
public class Test7 {

        public static void main(String[] args) {
                Scanner sc=new Scanner(System.in);
                System.out.println("请输入行数:");
                int hang=sc.nextInt();     //行数
                int lie=hang;                  //因为是等长,所以行,列相同
                int num=1;                    //要添加的数据,最小值是1(即初始化值为1)
                int i=0;                          //代表行的初始化值为0,代表二维数组元素索引,最大为hang-1   
                int j=0;                          //代表列的初始化值为0,代表二维数组里面一维数组元素索引,最大为lie-1即hang-1
               
                //定义二维数组
                int arr[][]=new int[hang][lie];
               
                while (num<=hang*lie) {      //循环的条件是:要添加的数据num<=最大值hang*lie
                        /**
                         * 第一次循环打印的是最外圈添加的数据,把每一圈作为一次完整的循环
                         * 当j=i=0时,打印外圈上面的一行,从左往右添加数据,数据num从初始值1开始递加即num++
                         * 第一个元素开始开始j=i即arr[0][0]=1,后面的是arr[0][1],arr[0][2]....;
                         * 此后最后一个元素的条件j<hang-1即arr[0][hang-1]例如行数为5的第一行最后一个元素为arr[0][4]
                         */
                        for (j=i; j<hang-i; j++) {
                                arr[i][j]=num++;
                        }
                        /**
                         *每一圈的最右边一列,从上到下添加数据,数据num也是递加的而且是从arr[0][hang-1]的基础上开始的num++
                         *那么这一列数据第一个元素值已经有了,第二个元素在第二行则i+1,即i++,且i++<lie=hang=j+1
                         *那么这一列元素为arr[1][hang-1],arr[2][hang-1]...i最大为hang-1
                         *最后一个元素为arr[hang-1][hang-1]例如行数为5的数组这一列最后一个元素为arr[4][4]
                         */
                        j--;
                        i++;
                        for (; i<j+1; i++) {
                                arr[i][j]=num++;                               
                        }
                        /**
                         * 每一圈最下面的一行,从右往左添加元素而添加的元素,是在本行最后一个元素arr[hang-1][hang-1]基础上递加的num++
                         * 那么这一行的元素为从右往左arr[hang-1][hang-1],arr[hang-1][hang-1-1]...arr[hang-1][0]即i-1,j--且j>=hang-1-i
                         */                       
                        i--;
                        j--;
                        for(;j>=hang-1-i;j--){
                                arr[i][j]=num++;
                        }
                        /**
                         * 每一圈最左边一列,从下往上添加元素,是在本列最后一个元素arr[hang-1][0]的基础上递加的num++,
                         * 而第一个元素已经添加过了即arr[0][0]=1,所以添加的时候截止到第二个
                         * 从下往上列不变,而行数逐步递减i--即arr[hang-1][0],arr[hang-2][0]...arr[hang-hang+1][0]即i>=j+1
                         */
                        j++;
                        i--;
                        for(;i>=j+1;i--){
                                arr[i][j]=num++;
                        }
                        /**
                         * 这一圈循环结束后,要为下一圈循环做准备
                         * 行加1即i++,列加1即j++
                         */
                        i++;
                        j++;
                }
                printArray(arr);
        }       
        public static void printArray(int[][] arr){
               
                /**
                 * for循环嵌套打印
                 * 行i<arr.length
                 * 列j<arr[i].length
                 */
                for (int i = 0; i < arr.length; i++) {
                        for (int j = 0; j < arr[i].length; j++) {
                                System.out.print(arr[i][j]+"\t");
                        }
                        System.out.println();
                }
        }       
}

2 个回复

倒序浏览
6666666666666
回复 使用道具 举报
是入学面试还是什么题目?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马